深入浅出理解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的特点
- 基于OAuth2.0协议,为Web和移动应用程序提供了安全的身份验证和授权机制。
- 使用IDToken传递已认证用户的身份信息,以确保应用程序可以安全地访问用户的数据,同时保护用户的隐私。
- 提供了标准的身份验证流程,以便开发人员可以轻松地将OIDC集成到应用程序中。
- 支持移动应用程序和单页应用程序等不同类型的应用程序。
- OIDC还提供了一些其他的安全特性,如跨站点请求伪造(CSRF)防护,防止重放攻击等。
4 OIDC的工作流程
- End User通过浏览器导航到网站或者Web应用。
- End Userd点击登录并输入其用户名和密码。
- RP(Relying Party)向OpenID Provier(OP)发送请求。
- OP对用户进行身份验证并且提供授权
- OP将IDToken和AccessToken(可选)进行响应
- RP使用AccessToken发送请求给Userinfo Endpoint
- 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至少包含以下五个必要信息:
- iss:颁发ID Token的认证服务商。
- sub:已认证用户的唯一标识符。
- aud:ID Token的接收方,即客户端应用程序的客户端ID。
- exp:ID Token的过期时间。
- iat:ID Token的发行时间。
ID Token还包含以下可选信息:
- name:已认证用户的姓名。
- email:已认证用户的电子邮件地址。
- picture:已认证用户的头像URL。
- nonce:客户端应用程序生成的随机值,用于防止重放攻击。
- auth_time:用户进行身份验证的时间。
- acr:身份验证级别。
- amr:使用的身份验证方法。
- azp:授权服务器的客户端ID。
6 与OAuth2.0的区别是什么?
- 目的不同:OAuth2.0的主要目的是授权,允许客户端访问受保护的资源。而OIDC的主要目的是身份验证,验证已认证用户的身份。
- Token类型不同:OAuth2.0使用AccessToken来授权访问受保护的资源。而OIDC使用IDToken来传递已认证用户的身份信息。
- 认证流程不同:OAuth2.0的认证流程是一个授权流程,客户端会向授权服务器请求一个AccessToken。OIDC的认证流程是一个身份验证流程,客户端会向授权服务器请求一个IDToken。
- 返回的信息不同: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。