当前位置:网站首页>【OAuth2】十八、OIDC的认识应用
【OAuth2】十八、OIDC的认识应用
2022-08-08 04:25:00 【北城小林】
一、认识OIDC
参考:https://openid.net/specs/openid-connect-core-1_0.html#Terminology
1、OIDC的概述
OIDC是Open ID Connect的缩写。
各种应用都需要做用户验证。最简单的方式是在本地维护一个数据库,存放用户账户和证书等数据。这种方式对于业务来说可能会不太友好:
注册和账户创建过程本来就很无聊。对于很多电商网站来说,它们会允许非登陆用户添加购物车,然后让用户下单时再注册。乏味的注册流程可能会导致很多用户放弃购买。
对于那些提供多个应用的企业来说,让各个应用维护各自的用户数据库,不管从管理还是安全层面来说,都是一个很大的负担。
对于这个问题,更好的方案是将用户认证和授权这些事情交给专门的identity provider(idp)服务来处理。
一个网站可以通过使用这类idp服务来极大简化用户的注册和登录流程。
2、OIDC和OAuth2的关系
OpenID Connect是位于OAuth2.0协议之上的身份层。 它使客户端能够基于授权服务器的验证来验证最终用户的身份。OAuth2.0提供了授权,即基于权限验证是否有权访问某些内容的过程。 OpenID Connect提供身份验证,即验证身份的过程。 这可以通过表单身份验证来完成,其中sql服务器存储必要的信息以对用户进行身份验证。
3、OpenID Connect所涉及的角色如下:
- EU End User的缩写,指的是 一个最终用户。
- RP:Relying Party,申请授信信息的可信客户端(既上文中提到的三方应用)。
-OP:OpenID Provider,提供身份认证的服务方,比如google和facebook等公司的系统。 - id token:包含身份认证信息的JWT。
- user info api,返回用户信息的接口,当RP使用id token来访问时,返回授权用户的信息。
4、OpenID Connect 协议抽象地遵循以下步骤。
RP(客户端)向 OpenID 提供者(OP)发送请求。
OP 对最终用户进行身份验证并获得授权。
OP 使用 ID 令牌响应,通常是访问令牌。
RP 可以向 UserInfo 端点发送带有访问令牌的请求。
UserInfo 端点返回有关最终用户的声明。
5、 ID Token
OpenID Connect 对 OAuth 2.0 进行的主要扩展以使最终用户能够被验证是 ID 令牌数据结构。ID 令牌是一个安全令牌,其中包含有关授权服务器在使用客户端时对最终用户进行身份验证的声明,以及可能的其他请求声明, ID Token 表示为 JSON Web 令牌 (JWT) [JWT]。
ID Token 必须使用JWS [JWS] 进行签名,并且可以选择分别使用JWS [JWS] 和JWE [JWE]进行签名和加密,从而根据第 16.14 节提供身份验证、完整性、不可否认性和可选的机密性。如果 ID 令牌已加密,则必须先对其进行签名然后加密,结果是嵌套 JWT,如[JWT]中所定义。ID 令牌不得使用none 作为alg值,除非使用的响应类型从授权端点返回没有 ID 令牌(例如使用授权代码流时)并且客户端在注册时明确请求使用 none。
ID Token不应使用 JWS 或 JWE x5u、 x5c、 jku或 jwk 标头参数字段。相反,根据第 10 节,使用发现和注册参数预先传达对所使用密钥的引用。
以下是 ID Token 中的声明集(JWT 声明集)的非规范示例:‘’
{
"iss": "https://server.example.com",
"sub": "24400320",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"auth_time": 1311280969,
"acr": "urn:mace:incommon:iap:silver"
}
二、如何进行OIDC认证
OIDC的认证流程主要是由OAuth2的几种授权流程扩展而来,有以下三种:
- Authorization Code Flow 基于OAuth2授权码流程进行OIDC认证授权
- Implicit Flow 基于OAuth2隐匿流,由于OAuth2.1移除了隐匿流,所以这个应该也会被移除。
- Hybrid Flow 基于以上两者的混合流,也应该会被移除。
- 至于为什么没客户端凭据模式,是因为客户端凭据被设计用来做客户端之间的交互和End User根本没用半毛钱关系。所以重点就是Authorization Code Flow。
1、使用授权代码流程进行身份验证Authorization Code Flow
本节介绍如何使用授权代码流程执行身份验证。使用授权代码流时,所有令牌都从令牌端点返回。
授权码流向客户端返回一个授权码,然后客户端可以直接将其交换为 ID Token 和 Access Token。这提供了不将任何令牌暴露给用户代理以及可能访问用户代理的其他恶意应用程序的好处。授权服务器还可以在将授权代码交换为访问令牌之前对客户端进行身份验证。授权码流程适用于可以在自己和授权服务器之间安全地维护客户端密钥的客户端。
你必须在请求中的scope参数中携带openid,授权服务器收到请求后会多返回一个EU的用户信息ID Token。流程上和OAuth2授权码流程完全一样。
2、授权码流程步骤
- 客户端准备一个包含所需请求参数的身份验证请求。
- 客户端将请求发送到授权服务器。
- 授权服务器对最终用户进行身份验证。
- 授权服务器获得最终用户同意/授权。
- 授权服务器使用授权码将最终用户发送回客户端。
- 客户端使用令牌端点处的授权码请求响应。
- 客户端收到响应正文中包含 ID Token 和 Access Token 的响应。
- 客户端验证 ID 令牌并检索最终用户的主题标识符。
3、用户信息端点
UserInfo 端点是一个 OAuth 2.0 受保护资源,它返回有关经过身份验证的最终用户的声明。为了获得有关最终用户的请求声明,客户端使用通过 OpenID Connect 身份验证获得的访问令牌向 UserInfo 端点发出请求。这些声明通常由一个 JSON 对象表示,该对象包含声明的名称和值对集合。
与 UserInfo 端点的通信必须使用 TLS。有关使用 TLS 的更多信息,
UserInfo 端点必须支持使用RFC 2616 [RFC2616] 中定义的 HTTP GET和 HTTP POST方法。
UserInfo 端点必须接受访问令牌作为 OAuth 2.0 Bearer Token Usage [RFC6750]。
UserInfo 端点应该支持使用 跨域资源共享 (CORS) [CORS] 和/或其他适当的方法,以使 Java 脚本客户端能够访问端点。
OIDC还提供用户信息端点,这个端点是一个资源端点。它的请求方式为:
GET /userinfo HTTP/1.1
Host: server.example.com
Authorization: Bearer SlAV32hkKG
也可以是POST请求。基本的返回值为:
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": "[email protected]",
"picture": "http://example.com/janedoe/me.jpg"
}
邮箱手机是需要设置 范围值 scope=openid profile email phone
openid官网 https://openid.net/developers/specs/
二、Spring Authorization Server中的OIDC是如何配置的
1、 OidcConfigurer
Spring Authorization Server的OIDC配置都在OidcConfigurer这个配置类中,该配置类更像一个适配器,它并不直接提供配置,而是聚合了OIDC子协议的配置:
2、OidcUserInfoEndpointConfigurer
先看用户信息端点,这个在上一章中已经提及了,不再赘述,我们只关注它做了什么。该配置类负责配置两个东西。
2.1、OidcUserInfoEndpointFilter
这个过滤器会拦截/userinfo端点请求,但是并没有像其它过滤器一样从HttpServletRequest中提取参数封装成Authentication,而是直接从安全上下文SecurityContext中获取Authentication,然后组装一个OidcUserInfoAuthenticationToken交给下面要讲的OidcUserInfoAuthenticationProvider处理,最终获取OIDC用户信息OidcUserInfo并以JSON的方式返回。
**这里的Authentication是从哪里来的呢?**答案就在OidcUserInfoAuthenticationProvider中。
2.2、OidcUserInfoAuthenticationProvider
OidcUserInfoAuthenticationProvider负责处理用户信息端点请求的根本逻辑,主要提供认证过的OidcUserInfoAuthenticationToken并返回,交由OidcUserInfoEndpointFilter处理。
边栏推荐
- Heterogeneous on the Graph paper to share 】 【 small sample learning: HG - Meta: Graph Meta - learning over Heterogeneous Graphs
- This article will give you a thorough understanding of synchronized and Lock
- 响应式pbootcms模板健身器械类网站
- 面向6G的通信感知一体化架构与关键技术
- 高薪程序员&面试题精讲系列134之微服务网关有哪些限流算法?如何实现限流?
- leetcode: 874. Simulate a walking robot
- 类似Bugfree的9大在线缺陷管理软件
- torch.view()函数用法
- Basic introduction to NLP
- vulnhub-DC-5 target drone penetration record
猜你喜欢

New ToDesk Enterprise Edition | Ten new features to make enterprise remote control safer, more convenient and smoother

手把手教你手撕SPF生成树(OSPF区域内防环)

The research project of the Institute of Metal Research of the Chinese Academy of Sciences has been certified by Huawei, helping to develop a new paradigm in materials science!

Shell 脚本 — 多行注释、开启子/不开启子进程执行、转义带颜色输出、读取键盘输入、输入输出重定向、单双引号、命令替换、读取变量、系统变量、正则过滤、算术运算、一行多条命令、字符串比较

新零售项目及离线数仓核心面试,,220807,,

内修昇思MindSpore AI框架,外重行业汇聚,华为大模型的不平凡之路

XDR技术

07查询表达式 及 page分页、order 排序《ThinkPHP6 入门到电商实战》

亚马逊云科技Build On学习心得

Let your text be seen by more people: Come and contribute, the payment is reliable!
随机推荐
MySql入门教程
NetCore使用Dapper查询数据
2022-08-07 mysql/stonedb慢SQL-子查询-半连接
egg-session stores data to redis
[opencv] Introduction to opencv development kit
leetcode 112. Path sum recursion
unity之粒子特效制作图片拼合文字效果
中间件的一些坑记录
【冷启动】快手《POSO: Personalized Cold Start Modules for Large-scale Recommender Systems》
XDR技术
Young freshmen who yearn for open source | The guide to avoiding pits from open source to employment is here!
机器学习笔记:学习率预热 warmup
使用ffmpeg解码音频sdl(push)播放
国内最主流的5大项目工时管理系统
32. 你知道Redis的字符串是怎么实现的吗?
mmedicting的get_flops.py的使用
cube-studio 部署过程
剑指Offer 18.删除链表的节点
亚马逊云科技Build On学习心得
Let your text be seen by more people: Come and contribute, the payment is reliable!