深入浅出理解OIDC

深入浅出理解OIDC

1 什么是OIDC?

OIDC的全称是OpenID Connect,是一个基于OAuth 2.0的轻量级认证+授权协议,OIDC是一个基于OAuth2.0协议的身份验证协议,它为Web和移动应用程序提供了安全的身份验证和授权机制。

2 OIDC的核心

OIDC协议的核心是ID Token,它是一个JSON Web Token (JWT),用于传递已认证用户的身份信息。在OIDC协议中,用户首先向授权服务器进行身份验证。一旦用户通过身份验证,授权服务器会颁发一个Access Token和一个ID Token。

  • Access Token用于访问受保护的资源

  • ID Token用于传递已认证用户的身份信息。

Tips

AccessToken是可选的。在客户端是需要认证用户的身份信息,而不需要访问受保护的资源的时候,可以不用返回AccessToken。

3 OIDC的特点

  1. 基于OAuth2.0协议,为Web和移动应用程序提供了安全的身份验证和授权机制。
  2. 使用IDToken传递已认证用户的身份信息,以确保应用程序可以安全地访问用户的数据,同时保护用户的隐私。
  3. 提供了标准的身份验证流程,以便开发人员可以轻松地将OIDC集成到应用程序中。
  4. 支持移动应用程序和单页应用程序等不同类型的应用程序。
  5. OIDC还提供了一些其他的安全特性,如跨站点请求伪造(CSRF)防护,防止重放攻击等。

4 OIDC的工作流程

  1. End User通过浏览器导航到网站或者Web应用。
  2. End Userd点击登录并输入其用户名和密码。
  3. RP(Relying Party)向OpenID Provier(OP)发送请求。
  4. OP对用户进行身份验证并且提供授权
  5. OP将IDToken和AccessToken(可选)进行响应
  6. RP使用AccessToken发送请求给Userinfo Endpoint
  7. Userinfo Endpoint返回End User的Claims

Tips

End User:使用已注册的客户端访问资源的人。

Relying Party(RP):信赖方,受信任的客户端,身份认证和授权信息的消费方。

OpenId Provider:有能力提供EU认证的服务(比如OAuth2.0的授权服务),用来为RP提供EU的身份认证。

Identity Token(ID Token):身份令牌表示EU身份验证的结果(至少包含sub)以及EU如何及何时进行身份验证的信息。它还可以自定义其他标识数据。它是JWT格式的。

Userinfo Endpoint:用户信息接口,RP可以使用AccessToken访问该接口,返回EU的信息。

5 ID Token的标准

OIDC标准规定了ID Token是一种JSON Web Token,即JWT。它是在EU进行身份验证后由认证服务提供商(Identity Provider,IDP)颁发给客户端应用程序的。

ID Token至少包含以下五个必要信息:

  1. iss:颁发ID Token的认证服务商。
  2. sub:已认证用户的唯一标识符。
  3. aud:ID Token的接收方,即客户端应用程序的客户端ID。
  4. exp:ID Token的过期时间。
  5. iat:ID Token的发行时间。

ID Token还包含以下可选信息:

  1. name:已认证用户的姓名。
  2. email:已认证用户的电子邮件地址。
  3. picture:已认证用户的头像URL。
  4. nonce:客户端应用程序生成的随机值,用于防止重放攻击。
  5. auth_time:用户进行身份验证的时间。
  6. acr:身份验证级别。
  7. amr:使用的身份验证方法。
  8. azp:授权服务器的客户端ID。

6 与OAuth2.0的区别是什么?

  1. 目的不同:OAuth2.0的主要目的是授权,允许客户端访问受保护的资源。而OIDC的主要目的是身份验证,验证已认证用户的身份。
  2. Token类型不同:OAuth2.0使用AccessToken来授权访问受保护的资源。而OIDC使用IDToken来传递已认证用户的身份信息。
  3. 认证流程不同:OAuth2.0的认证流程是一个授权流程,客户端会向授权服务器请求一个AccessToken。OIDC的认证流程是一个身份验证流程,客户端会向授权服务器请求一个IDToken。
  4. 返回的信息不同:OAuth2.0返回AccessToken以及可选的RefreshToken。而OIDC返回IDToken以及可选的AccessToken和RefreshToken。

以通俗的话来讲:在OAuth2.0中,第三方客户端如果想要受保护的资源需要提供AccessToken。而OIDC比OAuth2.0不仅支持原有的AccessToken的方式,同时还提供了IDToken,使得第三方客户端能够解析IDToken从而获得用户信息。

Tips:

IDToken是JWT,得益于JWT的防篡改机制,使得IDToken可以安全地传递给第三方客户端并且容易被解析且验证。

7 OAuth2.0的Userinfo和OIDC的IDToken

OAuth2.0标准是一定有一个Userinfo的Endpoint,即在OAuth2.0中可以使用AccessToken向Token签发者获取Userinfo。同时OAuth2.0规定Userinfo至少返回用户的sub(即用户的唯一标识)。

OIDC的IDToken标准是包含用户的iss,sub,aud,exp,iat等,即IDToken的发行者,用户的唯一标识,IDToken的接受者,IDToken的过期时间,IDToken的发行时间。

OAuth2.0的Userinfo和OIDC的IDToken都包含用户的唯一标识sub,那既然OAuth2.0已经可以获取用户唯一标识了,那为什么还要更新到OIDC使用IDToken来获取用户的唯一标识呢?答案是,IDToken是通过JWT加密的,得益于JWT的防篡改性,该IDToken一定是由Issuer签发的并且没有被篡改的。但是OAuth2.0的Userinfo则不一定,它只是client通过AccessToken向Endpoint发起请求从而获得用户信息,是可能被篡改的(修改请求的响应即可达到篡改的目的)。

所以IDToken获取的用户信息一定是没有被篡改过的,但是Userinfo获取的用户信息则可能会被篡改。

总结

OIDC是OAuth2.0的增强,OIDC的核心是IDToken。相较于OAuth2.0,在授权流程多返回了IDToken,并且OIDC的Identity Provider还提供ID Token的认证服务。

对于第三方应用程序(RP)来说可以更加安全地获取到登录用户的个人信息和唯一标识,使得第三方应用程序可以自己存储已登录用户的个人信息,但是不需要提供认证服务,因为认证服务是交由了Identity Provider。

你可能感兴趣的:(web安全)