一、OIDC简介

OIDC是OpenID Connect的简称,OIDC=(Identity, Authentication) + OAuth 2.0。它在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议。OAuth2是一个授权协议,它无法提供完善的身份认证功能,OIDC使用OAuth2的授权服务器来为第三方客户端提供用户的身份认证,并把对应的身份认证信息传递给客户端,且可以适用于各种类型的客户端(比如服务端应用,移动APP,JS应用),且完全兼容OAuth2,也就是说你搭建了一个OIDC的服务后,也可以当作一个OAuth2的服务来用。

二、OIDC的核心概念

OIDC的核心在于在OAuth2的授权流程中,一并提供用户的身份认证信息(ID Token)给到第三方客户端,ID Token使用JWT格式来包装,得益于JWT(JSON Web Token)的自包含性,紧凑性以及防篡改机制,使得ID Token可以安全的传递给第三方客户端程序并且容易被验证。此外还提供了UserInfo的接口,用于获取用户的更完整的信息。

三、OIDC的认证流程

主要角色:

EU(End User):一个人类用户。
RP(Relying Party ): 用来代指OAuth2中的受信任的客户端,身份认证和授权信息的消费方;
OP(OpenID Provider):有能力提供EU认证的服务(比如OAuth2中的授权服务),用来为RP提供EU的身份认证信息;
ID Token:JWT格式的数据,包含EU身份认证的信息。
UserInfo Endpoint:用户信息接口(受OAuth2保护),当RP使用Access Token访问时,返回授权用户的信息,此接口必须使用HTTPS。

流程简述:

(1)RP发送一个认证请求给OP;
(2)OP对EU进行身份认证,然后提供授权;
(3)OP把ID Token和Access Token(需要的话)返回给RP;
(4)RP使用Access Token发送一个请求UserInfo EndPoint;
(5)UserInfo EndPoint返回EU的Claims。

四、ID_Token概念

OIDC对OAuth2最主要的扩展就是提供了ID Token。
ID Token是一个安全令牌,是一个授权服务器提供的包含用户信息(由一组Cliams构成以及其他辅助的Cliams)的JWT格式的数据结构。

4.1)ID Token的主要构成部分(使用OAuth2流程的OIDC):

字段 释义
iss (Issuer Identifier) 必须。提供认证信息者的唯一标识。一般是一个https的url(不包含querystring和fragment部分)。
sub (Subject Identifier) 必须。iss提供的EU的标识,在iss范围内唯一。它会被RP用来标识唯一的用户。最长为255个ASCII个字符。
aud (Audience) 必须。标识ID Token的受众。必须包含OAuth2的client_id。
exp (Expiration time) 必须。过期时间,超过此时间的ID Token会作废不再被验证通过。
iat (Issued At Time) 必须。JWT的构建的时间。
auth_time (AuthenticationTime) EU完成认证的时间。如果RP发送AuthN请求的时候携带max_age的参数,则此Claim是必须的。
nonce RP发送请求的时候提供的随机字符串,用来减缓重放攻击,也可以来关联ID Token和RP本身的Session信息。
acr (Authentication Context Class Reference) 可选。表示一个认证上下文引用值,可以用来标识认证上下文类。
amr (Authentication Methods References) 可选。表示一组认证方法。
azp (Authorized party) 可选。结合aud使用。只有在被认证的一方和受众(aud)不一致时才使用此值,一般情况下很少使用。
ID Token通常情况下还会包含其他的Claims(毕竟上述claim中只有sub是和EU相关的,这在一般情况下是不够的,必须还需要EU的用户名,头像等其他的资料,OIDC提供了一组公共的cliams)。另外ID Token必须使用JWS进行签名和JWE加密,从而提供认证的完整性、不可否认性以及可选的保密性。
一个ID Token的例子如下:
{"iss": "https://example.com","sub": "111","aud": "s6BbKhgqt7","nonce": "n-0S6_WzA2Mj","exp": 1311280000,"iat": 1311280000,"auth_time": 1311280969,"acr": "urn:mace:incommon:iap:silver"}

五、OIDC的认证模式

OIDC如何获取到ID Token?

因为OIDC基于OAuth2,所以OIDC的认证流程主要是由OAuth2的几种授权流程延伸而来的:

①Authorization Code(授权码模式):使用OAuth2的授权码来换取Id Token和Access Token。
②Implicit (简化模式):使用OAuth2的Implicit流程获取Id Token和Access Token。
③Hybrid(混合模式):混合Authorization Code +Implicit。

OAuth2中还有基于Resource Owner Password Credentials Grant(密码模式)和Client Credentials Grant(客户端模式)的方式来获取Access Token,为什么OIDC没有扩展这些方式呢?

Resource Owner Password Credentials Grant(密码模式)是需要用途提供账号密码给RP的,既然已经得到用户的用户名、密码了,便没必要再去获取ID_Token了。
Client Credentials Grant(客户端模式) 这种方式不需要用户参与,与用户身份认证并不兼容。
这也反映了授权和认证的差异,只使用OAuth2来做身份认证的事情是存在不足的。

5.1)基于Authorization Code(授权码模式)的认证

5.1.1)基于Authorization Code(授权码模式)的认证请求

这种方式使用OAuth2的Authorization Code的方式来完成用户身份认证,所有的Token都是通过Token EndPoint(OAuth2中定义:https://tools.ietf.org/html/rfc6749#section-3.2)来发放的。
构建一个OIDC的Authentication Request需要提供如下的参数:

  • scope:必须。OIDC的请求必须包含值为“openid”的scope的参数。
  • response_type:必选。同OAuth2。
  • client_id:必选。同OAuth2。
  • redirect_uri:必选。同OAuth2。
  • state:推荐。同OAuth2。防止CSRF, XSRF。

以上这5个参数是和OAuth2相同的。除此之外,还定义了如下的参数:

  • response_mode:可选。OIDC新定义的参数(OAuth 2.0 Form Post Response
    Mode),用来指定Authorization Endpoint以何种方式返回数据。
  • nonce:可选。ID Token中的出现的nonce就是来源于此。
  • display :
    可选。指示授权服务器呈现怎样的界面给EU。有效值有(page,popup,touch,wap),其中默认是page。page=普通的页面,popup=弹出框,touch=支持触控的页面,wap=移动端页面。
  • prompt:可选。这个参数允许传递多个值,使用空格分隔。用来指示授权服务器是否引导EU重新认证和同意授权(consent,就是EU完成身份认证后的确认同意授权的页面)。有效值有(none,login,consent,select_account)。none=不实现现任何认证和确认同意授权的页面,如果没有认证授权过,则返回错误login_required或interaction_required。login=重新引导EU进行身份认证,即使已经登录。consent=重新引导EU确认同意授权。select_account=假如EU在授权服务器有多个账号的话,允许EU选择一个账号进行认证。
  • max_age:可选。代表EU认证信息的有效时间,对应ID
    Token中auth_time的claim。比如设定是20分钟,则超过了时间,则需要引导EU重新认证。
  • ui_locales:可选。用户界面的本地化语言设置项。
  • id_token_hint:可选。之前发放的ID Token,如果ID
    Token经过验证且是有效的,则需要返回一个正常的响应;如果有误,则返回对应的错误提示。
  • login_hint:可选。向授权服务器提示登录标识符,EU可能会使用它登录(如果需要的话)。比如指定使用用户使用blackheart账号登录,当然EU也可以使用其他账号登录,这只是类似html中input元素的placeholder。
  • acr_values:可选。Authentication Context Class Reference values,对应ID
    Token中的acr的Claim。此参数允许多个值出现,使用空格分割。

以上是基于Authorization Code方式的OIDC的认证请求所需的参数。在OIDC的其他认证流程中也会有其他的参数或不同的参数值(稍有差异)。

示例请求串:

GET
/authorize?response_type=code&scope=openid%20profile%20email&client_id=s6BhdRkqt3&state=af0ifjsldkj&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
HTTP/1.1
Host: server.example.com

5.1.2)基于Authorization Code(授权码模式)的认证请求的响应

在授权服务器接收到认证请求之后,需要对请求参数做严格的验证,具体的规则参见http://openid.net/specs/openid-connect-core-1_0.html#AuthRequestValidation,验证通过后引导EU(End User)进行身份认证并且同意授权。在这一切都完成后,会重定向到RP指定的回调地址,并且把code和state参数传递过去。
比如:

HTTP/1.1 302 Found
Location: https://client.example.org/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=af0ifjsldkj

5.1.3)ID_Token的获取

RP使用上一步获得的code来请求Token EndPoint,这一步同OAuth2,就不再展开细说了。然后Token EndPoint会返回响应的Token,其中除了OAuth2规定的部分数据外,还会附加一个id_token的字段。id_token字段就是上面提到的ID Token。例如:

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache

{
“access_token”: “SlAV32hkKG”,
“token_type”: “Bearer”,
“refresh_token”: “8xLOxBtZp8”,
“expires_in”: 3600,
“id_token”: “eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzc
yI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5
NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ
fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz
AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q
Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ
NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd
QyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoS
K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4
XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg”
}

在RP拿到这些信息之后,需要对id_token以及access_token进行验证(具体的规则参见http://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation和http://openid.net/specs/openid-connect-core-1_0.html#ImplicitTokenValidation)。

5.2)Implicit (简化模式)和Hybrid(混合模式)

Implicit (简化模式)的工作方式是在OAuth2 Implicit上附加提供id_token,认证请求的参数和基于Authorization Code(授权码模式)的流程稍有不同,具体的差异参考http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthRequest。

Hybrid(混合模式)则相当于Authorization Code(授权码模式)+Implicit (简化模式)。

六、UserInfo Endpoint

UserIndo EndPoint是一个受OAuth2保护的资源。在RP(Relying Party )得到Access Token后可以请求此资源,然后获得一组EU(End User)相关的Claims,这些信息可以说是ID Token的扩展,比如如果你觉得ID Token中只需包含EU(End User)的唯一标识sub即可(避免ID Token过于庞大),然后通过此接口获取完整的EU的信息。此资源必须部署在TLS(安全传输层协议)之上,
例如:
请求:

GET /userinfo
HTTP/1.1
Host: server.example.com
Authorization: Bearer SlAV32hkKG

响应:

HTTP/1.1 200 OK
Content-Type: application/json
{ “sub”: “248289761001”, “name”: “Jane Doe”, “given_name”:
“Jane”, “family_name”: “Doe”, “preferred_username”: “j.doe”,
“email”: “janedoe@example.com”, “picture”:
“http://example.com/janedoe/me.jpg” }

其中sub代表EU(End User)的唯一标识,这个claim是必须的,其他的都是可选的。

OIDC认证授权协议相关推荐

  1. 基于CAS搭建OIDC认证授权协议

    OIDC协议作为以OAuth2为基础衍生的出新的认证授权协议,将OAuth2的授权协议与OpenId的认证协议相结合,从而生产的新的sso协议OIDC协议(OpenID Connect).本文讲解的是 ...

  2. 别再搞错!OAuth 2.0只是授权协议,OIDC才是认证授权协议

    上一文我们对Keycloak保护Spring Boot应用进行了实操.让大家见识到了Keycloak的强大.为了掌握Keycloak就必须对OpenID Connect(OIDC)协议进行了解. OI ...

  3. 认证与授权协议对比:OAuth2、OpenID、SMAL

    认证授权是目前大多数系统都必须要实现都功能,认证就是验证用户都身份,授权就是验证身份后对受限资源的访问控制.最开始是单个平台要做,后来在互联网时代到来,一个账户可登陆多个平台,然后是各种开放平台账户共 ...

  4. 统一认证授权平台keycloak太牛了,我要搞一搞

    最近想要打通几个应用程序的用户关系,搞一个集中式的用户管理系统来统一管理应用的用户体系.经过一番调研选中了红帽开源的Keycloak,这是一款非常强大的统一认证授权管理平台.之所以选中了Keycloa ...

  5. 通过 api 和 keycloak 理解OIDC认证

    参考资料 通过Keycloak API理解OAuth2与OpenID Connect 什么是keycloak如何在nodejs中使用它 如何通过 OIDC 协议实现单点登录? https://jwt. ...

  6. [认证授权] 5.OIDC(OpenId Connect)身份认证授权(扩展部分)

    [认证授权] 5.OIDC(OpenId Connect)身份认证授权(扩展部分) 原文:[认证授权] 5.OIDC(OpenId Connect)身份认证授权(扩展部分) 在上一篇[认证授权] 4. ...

  7. SDU信息门户(7)图灵认证授权子系统:oauth协议详解(3)

    2021SC@SDUSC 目录 一.引言 二.代码分析 1.利用刷新令牌获取访问令牌的具体细节 2.根据授权码获取访问令牌和刷新令牌 3.认证授权基本信息配置 4.通过授权码找到授权 5.获取访问授权 ...

  8. 网页提示未认证授权的应用服务器,授权认证(IdentityServer4)

    区别 OpenId: Authentication :认证 Oauth: Aurhorize :授权 输入账号密码,QQ确认输入了正确的账号密码可以登录 --->认证 下面需要勾选的复选框(获取 ...

  9. [认证授权] 2.OAuth2授权(续) amp;amp; JSON Web Token

    0. RFC6749还有哪些可以完善的? 0.1. 撤销Token 在上篇[认证授权] 1.OAuth2授权 中介绍到了OAuth2可以帮我们解决第三方Client访问受保护资源的问题,但是只提供了如 ...

最新文章

  1. IO Streams:缓冲流
  2. 配置 Hdp 4 Window 中的一些问题
  3. vm服务器虚拟化如何漂移,解决虚拟机漂移问题的自动化网络管理
  4. java的for循环取出数据只是拿到最后一个_一问SQL优化就无从藏身?那只是你对原理的精髓掌握不深
  5. linux给ftp账号分配sftp权限,Linux设置用户通过SFTP访问目录的权限教程
  6. iOS利用SDWebImage实现缓存的计算与清理
  7. linux运维企业shell,shell脚本-企业日常巡检脚本
  8. 无需充电的太阳能汽车有多强?约17万起,续航高达1609km
  9. docker host模式拿到nginx远程ip端口_docker网络模式实战
  10. java登陆注册界面_java编写登陆注册页面(简单一点的,连接数据库)
  11. 基因组组装---基因组大小评估(genome survey)
  12. android bmob上传图片,Bmob+Android+ECharts 实现移动端数据上传与图表展示
  13. SpringBoot项目启动 错误: 找不到或无法加载主类 com.abc.demo.DemoApplication
  14. iTutorGroup英语实用篇:出国旅游常用英语对话送你
  15. 算法很美 笔记 4.多维数组与矩阵
  16. 护眼灯显色指数多大最好?一文了解护眼灯显色指数怎么选
  17. 跨城实践中,腾讯如何应用 Apache Pulsar
  18. PHP实现服务器探针
  19. Android 切片软件使用教程,Cutterman 切图使用指南
  20. 284work 周末加班

热门文章

  1. java 解析rmc_GPS 0183协议GGA、GLL、GSA、GSV、RMC、VTG解释 + 数据解析 | 技术部落
  2. 风险概率与影响评估-工具技术
  3. 人工智能技术的演进和发展
  4. 攻防世界-MISC:掀桌子
  5. 记:本科应届生春招求职
  6. Microsoft.Practices.EnterpriseLibrary
  7. outlook批量下载邮件 统计
  8. winscp链接linux网络错误被决绝,解决了winscp连接不上的问题
  9. 《Go语言圣经》第一章:入门-习题解答及读书笔记精华摘要
  10. sqlite 修改表的列