在OAuth2.0中,隐式授权使用的response_type是token,而在OIDC中,变为了id_token token或是仅id_token,当仅使用id_token时,则不会返回Access token了。其余参数则和OAuth2.0中的隐式授权一致。但OIDC中相比OAuth2.0隐式流程额外增加了一个参数nonce
- nonce:必填。字符串值,用于将第三方应用的会话与 Id token关联,并缓解重放攻击。该值未经修改地从身份验证请求传递到 Id token中。为了防止攻击者猜中值,随机数值中必须存在足够的熵。
注意:隐式流程中OAuth2.0的state和OIDC的nonce区别
https://stackoverflow.com/questions/46844285/difference-between-oauth-2-0-state-and-openid-nonce-parameter-why-state-cou
1、第三方应用(RP)携带参数跳转到授权服务器(OP)的认证授权页面,等待用户认证与执行授权。
2、当授权服务器(OP)完成对用户认证信息的审核和授权范围的校验,重定向回第三方应用(RP)并按照请求时的response_type返回id token、access token(当仅设置id_token时不返回)。注意url的hash部分(#后面)。
3、后续便是请求用户信息或是授权内的资源。
这种是将授权码和隐式流程结合起来,一部分token来源于授权服务器(OP)重定向到第三方应用(RP)时带过来,一部分来源于第三方应用(RP)向授权服务器(OP)发起请求而得到。这种流程中,response_type,可以混合着用,如code id_token,code token或是code id_token token。
1、第三方应用(RP)向授权服务器(OP)发起认证请求。此处使用授权码和隐式中仅id_token的组合。
2、当授权服务器(OP)完成对用户认证信息的审核和授权范围的校验,重定向回第三方应用(RP)并按照请求时的response_type返回id token、access token(当仅设置id_token时不返回)。
- access_token:当response_type中有token选项时,则会返回access_token
- id_token:当response_type中有id_token选项时,则会返回id_token
- code:混合流程中,这个是必选的,所以总是会返回code。
3、第三方应用(RP)通过code来请求授权服务器(OP)换取Token。这和授权码流程一致了。
认证服务返回的ID Token需要严格遵守JWT(JSON Web Token)的定义,下面是JWT(JSON Web Token)的定义细节:
- iss=Issuer Identifier: 必须。认证服务的唯一标识,一个区分大小写的https URL,不包含query和fragment组件。
- sub=Subject Identifier:必须。iss提供的终端用户的标识,在iss范围内唯一,最长为255个ASCII个字符,区分大小写。
- aud=Audience(s):必须。标识ID Token的受众,必须包含OAuth2的client_id,分大小写的字符串数组。
- exp=Expiration time:必须。超过此时间的ID Token会作废。
- iat=Issued At Time:必须。JWT的构建的时间。
- auth_time=AuthenticationTime:终端用户完成认证的时间。
- nonce:发送认证请求的时候提供的随机字符串,用来减缓重放攻击,也可以用来关联客户端Session。如果nonce存在,第三方应用必须验证nonce。
- acr=Authentication Context Class Reference:可选。表示一个认证上下文引用值,可以用来标识认证上下文类。
- amr=Authentication Methods References:可选。表示一组认证方法。
- azpAuthorized party:可选。结合aud使用。只有在被认证的一方和受众(aud)不一致时才使用此值,一般情况下很少使用。
如下是一个典型ID Token的示例:
{
"exp": 1614187991,
"iss": "https://authorization-server.com/oauth",
"sub": "a0903223-a120-91e0-c342-10bd237c24c1",
"aud": "client1",
"iat": 1614151991,
"auth_time": 0,
"nonce": "n-0S6_WzA2Mj",
"acr": "1",
"azp": "client1",
"nbf": 0,
"typ": "ID",
"session_state": "150df80e-92a1-4b0c-a5c5-8c858eb5a848",
"userId": "123456",
"preferred_username": "testera",
"given_name": "tester",
"family_name": "a",
"email": "testera@myweb.com"
}
关于ID Token的更详细的定义请参见OpenID Connect Core 1.0。
https://openid.net/connect/
https://www.jianshu.com/p/2c602974bc98
https://baike.baidu.com/item/OpenID?wtp=tt
http://www.imooc.com/article/4167
https://www.cnblogs.com/linianhui/p/openid-connect-core.html
来源:https://www.cnblogs.com/CKExp/p/16084545.html