1.ID Token是jwt,包含一组关于身份认证会话的声明(claim)
2.access token在oidc中也能使用,伴随着id token一起被发送到客户端,但是这不是必要的,因为id token已经包含了用户信息,access token只是为了和OAuth兼容。
3.oidc新增了用户端点,可以获取用户的个人信息
4.oidc规定客户端可以简单的发现授权服务器的所有端点
主要术语
EU:一个人类用户
RP:Relying Party,依赖放,只受信任的客户端
OP:OpenID Provider,有能力提供EU身份认证的服务,授权服务器
ID Token:jwt数据,包含EU身份认证的信息
UserInfo Endpoint:用户信息接口。当用户使用access token访问时,返回用户信息。
ID Token
包含了一组的Claims和其他辅助的公共的Claims
Authorization Code
认证过程
1.客户端准备好认证的必要参数,scope(必须包含openid),response_type,client_id,redirect_uri,state这5个必选参数。其他可选参数:response_mode,nonce,display。。。
2.客户端向授权服务器发起请求
3.授权服务器鉴定这个终端用户
4.授权服务器获得这个终端用户的授权信息
5.授权服务器给客户端一个授权码
6.客户端的用这个授权码请求授权服务器的token端点
7.客户端收到授权服务的响应,包含了ID Toekn和Access Token
8.客户端校验ID Token并获得该用户的个人信息
认证端点
认证请求
在授权端点,授权服务器必须同时支持GET和POST。当客户端使用GET时,参数以查询字符串的形式给出,当使用POST时,参数以表单形式提交。
Scope:必须的。其中必须包含openid
response_type:必须的。当使用的是Authorization Code时,该值为code
client_id:必须的。客户端标识
redirect_uri:必须的。重定向地址
state:推荐的。自己定一个值,用于防止跨站请求伪造
还要其他参数
认证请求验证
授权服务器必须对认证请求进行验证
1.授权服务器必须根据OAuth2.0验证所有的参数
2.确保scope里面包含了openid
3.确保所有需要的参数都存在
4.If the sub (subject) Claim is requested with a specific value for the ID Token, the Authorization Server MUST only send a positive response if the End-User identified by that sub value has an active session with the Authorization Server or has been Authenticated as a result of the request. The Authorization Server MUST NOT reply with an ID Token or Access Token for a different user, even if they have an active session with the Authorization Server. Such a request can be made either using an id_token_hint parameter or by requesting a specific Claim Value as described in Section 5.5.1, if the claims parameter is supported by the implementation.
授权服务器认证终端用户
授权服务器需要验证终端用户是否被授权
授权服务器必须与用户进行交互
1.终端用户没有被验证
2.在参数中带了prompt参数
在下列情况下,授权服务器不得与终端用户进行交互:
身份验证请求包含prompt参数,其值为none。在这种情况下,如果终端用户尚未通过身份验证或无法进行静默身份验证,则授权服务器必须返回一个错误。
授权服务器获得这个终端用户的授权信息
一旦对最终用户进行了身份验证,授权服务器必须在向依赖方发布信息之前获得授权决策。当所使用的请求参数允许时,可以通过与终端用户进行交互对话,明确表示同意的内容,或者通过处理请求的条件或其他方法(例如,通过以前的管理同意)建立连接
成功的认证响应
认证成功之后,会重定向到redirect_uri,并返回code和state(如果有的话)
错误的认证响应
error:必须的。错误代码
error_description:错误描述
error_uri:错误的uri
认证响应校验
客户端在收到服务端的认证响应之后,必须进行校验
Token 端点
Token请求
客户端向token 端点发起一个请求。
grant_type:authorization_code
code:获取的code码
redirect_uri=必须和前一次一样
必须使用POST请求和表单提交
Token请求验证
如果颁发了客户端凭据或使用了其他客户端身份验证方法,则对客户端进行身份验证
确保将授权码颁发给经过身份验证的客户端
确保授权码是有效的
验证以前没有使用授权码
确保2次的redirect_uri是一样的
验证使用的授权代码是为了响应OpenID Connect身份验证请求而发出的(以便从令牌端点返回ID令牌)。
成功的Token响应
在验证成功之后,返回ID Token和Access Token
响应使用application/json类型。
token_type必须是Bearer
错误的Token响应
返回application/json类型。
返回http 400
Token响应校验
客户端必须对IDToken和Access Token进行校验
注意:OIDC声明的只有Code,Implicit,Hybrid模式,而Password和Credentials都是OAuth2.0定义的,这两个可以说根本就没有用户认证这一说。
UserInfo Endpoint
userinfo端点存储着用户循序,需要用access token来获取
UserInfo请求
可以使用GET或者POST。必须使用Bearer Token
一般建议使用GET。
Authorization:Bearer xxxxx
成功的UserInfo响应
返回json对象
错误的UserInfo响应
返回http 401
客户端校验UserInfo响应
使用Scope来请求Claims的值
scope=openid profile email phone
使用Claims来请求Claims的值
把claims的值构造成一个json,
{
"userinfo":
{
"given_name": {"essential": true},
"nickname": null,
"email": {"essential": true},
"email_verified": {"essential": true},
"picture": null,
"http://example.info/claims/groups": null
},
"id_token":
{
"auth_time": {"essential": true},
"acr": {"values": ["urn:mace:incommon:iap:silver"] }
}
}
刷新令牌
必须使用POST的表单来提交。服务端必须验refresh token。
验证成功,会返回一个新的refresh token和access token
今天的文章OIDC协议_各车系的OBD协议「建议收藏」分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/74190.html