【笔记】浅谈OAuth2 accessToken和OIDC idToken的理解和使用场景

前言

OAuth2

官网:https://oauth.net/2/

OIDC:Open ID Connect

官网:http://openid.net/connect/

What is OpenID Connect?

OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol. It allows Clients to verify the identity of the End-User based on the authentication performed by an Authorization Server, as well as to obtain basic profile information about the End-User in an interoperable and REST-like manner.

OpenID Connect allows clients of all types, including Web-based, mobile, and JavaScript clients, to request and receive information about authenticated sessions and end-users. The specification suite is extensible, allowing participants to use optional features such as encryption of identity data, discovery of OpenID Providers, and session management, when it makes sense for them.

大致意思就是openid connect1.0是oauth2.0协议之上的一个简单的身份层;

为什么要使用idToken?

jwt的payload部分,一般包含7个默认字段信息(还不了解jwt的建议先在官网了解jwt的结构):

iss:发行人

exp:到期时间

sub:主题

aud:用户

nbf:在此之前不可用

iat:发布时间

jti:JWT ID用于标识该JWT

除以上默认字段外,我们还可以自定义私有字段,如下例:

大家都知道oauth2协议,会签发jwt形式的access token,用于接口请求的凭证;

笔者之前在做oauth2集成的时候一直在想,已经有了jwt签名的access token,为什么还需要idToken呢?

我刚开始有这样的疑问,有三个原因:

1.jwt的payload部分包含了丰富的信息,且还可以自定义私有字段,在自定义私有字段时候,将username等用户信息参数签发进来,不就满足了用户身份信息认证?

2.jwt有签名防篡改的能力,将username等用户信息签发到payload不会有篡改风险;

3.已经有access token的情况下,idToken显得多余;

 

后来在集成微软的azure oauth2登录的时候,终于Get到了idToken的优势,那么为什么要用idToken呢?

在我看来有以下原因:

1.在access token添加用户身份信息,可能导致用户信息泄露;

因为每次接口请求都携带access token,其payload部分的用户信息是可解析的,相当于是明文的;

2.access token目的是用于接口访问的凭证,如果同时包含用户信息的话,功能就不分离了;

3.使用idToken替换userinfo endpoint获取用户信息;

就像微软官方doc也提到:

一般oauth2协议,都提供userinfo endpoint获取用户信息,例微软:https://graph.microsoft.com/oidc/userinfo,使用access token调用此接口获取得到用户信息;idToken可节省调用userinfo API接口的额外消耗;

4.某些场景,如只需要用户登录认证并获取用户信息,而不必调用Resource Server的其他API;那么这种场景只需要返回idToken,accessToken将不必返回;

例如微软提到的sign-in request

Send the sign-in request

综上可知,idToken的优势就体现到了。

需要补充说明一点的是,idToken只用于用户身份信息认证,并不能用户接口调用的凭证,设计的系统的时候一定要区分开;

 

另外网上一些关于OIDC的解释,我觉得是有歧义的:

OIDC是基于OAuth2的,OAuth2只解决了授权的问题,没有解决认证问题,而OpenID是个认证协议,所以二者结合就是OIDC。

我认为:OAuth2应该是同时解决了认证和授权的问题;因为OAuth2登录,用户在第三方平台登录的时候,不管是输入凭证的方式,还是选择已登录account的方式,这个步骤就是认证的过程

然后用户也一并授权了能访问用户的信息,如头像,昵称等,并签发了access token,这个步骤是授权;

OIDC= OAuth2 + OpenID

我认为:OIDC并不一定OAuth2 + OpenID,如果是access token和idToken一并签发,这种场景是可以这么理解;但是像微软提到的sign-in request,这类场景仅单纯返回idToken,就不能这么认为了;

OIDC在OAuth2的access_token的基础上增加了身份认证信息, 通过公钥私钥配合校验获取身份等其他信息—– 即idToken

 

 

  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
OAuth2是一个用于授权的开放标准协议,它允许用户授权第三方应用访问他们在某个网站上存储的私密资源,而无需提供他们的用户名和密码。OAuth2提供了四种授权模式,分别是授权码模式、隐式授权模式、密码模式和客户端凭证模式。 OpenID Connect(OIDC)是基于OAuth2的认证协议,它添加了身份验证的能力。OIDC允许用户使用一个认证服务器进行认证,并且通过认证服务器颁发的令牌来访问受保护的资源。OIDC通过在OAuth2流程中引入身份验证,为用户提供了更安全和更简化的身份验证体验。 在Angular中,可以使用angular-oauth2-oidc库来支持OAuth2和OpenID Connect。这个库提供了一些方便的功能,比如验证令牌签名和散列以及与后端进行测试的资源来源和示例。它还准备好了针对即将到来的OAuth2.1的支持。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【授权与认证】OAuth 2.0 和 OIDC 的异同点](https://blog.csdn.net/qq_24433609/article/details/128806678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [angular-oauth2-oidc:在Angular中支持OAuth 2和OpenId Connect(OIDC)](https://download.csdn.net/download/weixin_42144707/18219284)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值