OAuth2.0 实现单点登录(四种授权方式)

news/2024/10/3 6:37:01

一、四种授权模式
1、客户端模式(Client Credentials)
指客户端以自己的名义,而不是以用户的名,向“服务提供商”进行认证。严格的说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求“服务提供商”提供服务,其实不存在授权问题。
流程:

操作步骤说明:

【步骤1】【步骤2】客户端向授权服务器进行身份认证,并申请访问令牌(access_token)

【步骤3】授权认证服务器验证通过后,向客户端提供访问令牌(access_token)

【步骤4】客户端向资源服务器发出请求资源的请求

【客户端5】【客户端6】服务提供商的资源服务器返回数据给客户端使用

客户端发出的HTTP请求,包含一下参数:

举例:

https://oauth.example.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET

客户端模式说明:

服务提供者验证通过以后,直接返回令牌。这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。因此这就要求我们对client完全的信任,而client本身也是安全的。所以这种模式一般用来提供给我们完全信任的服务器端服务。比如,合作方系统对接,拉去一组用户信息。客户端模式适用于没有用户参加的,完全信任的一方或合作方服务器端程序接入。

2、密码模式(Resource Owner Password Credentials)
使用用户名/密码作为授权方式从授权服务器上获取令牌,一般不支持刷新令牌。这种方式风险很大,用户向客户端提供自己 的用户名和密码。客户端使用这些信息,向“服务提供商”索要授权。这种方式通常用于可信任的应用程序,比如用户拥有自己的资源服务器并且信任应用程序直接使用其凭据。

流程:

 

操作步骤说明:

【步骤1】【步骤2】用户向第三方客户端提供,其在服务提供商那里注册的用户名和密码

【步骤3】客户端将用户名和密码发送给授权服务器,向授权服务器请求访问令牌(access_token)

【步骤4】授权认证服务器确认身份无误后,向客户端提供访问令牌(access_token)

【步骤5】客户端携带access_token向资源服务器发出请求资源的请求

【步骤6】【步骤7】服务提供商的资源服务器返回数据给客户端使用

客户端拿着资源拥有者的用户名、密码向授权服务器请求令牌(access_token),包含如下参数:

 

举例:

https://oauth.example.com/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=password&username=USERNAME&password=PASSWORD

密码模式说明:

密码模式的优点是他的实现相对简单,适用于那些已经具有高度信任度的应用程序,例如移动应用程序或第一方Web应用程序。然而,密码模式也存在一些安全风险,因为他要求客户端直接处理用户的凭据,这可能会增加密码泄露的风险。因此,在使用密码模式时,必须非常小心的保护客户端的安全性,例如使用安全的存储和传输机制来处理用户凭据。

3、隐式授权模式(Implicit Grant)
首先用户访问页面时,会重定向到认证服务器,接着认证服务器给用户一个认证页面,等待用户授权,用户填写信息完成授权后,认证服务器返回token。

流程:

 

操作步骤说明:

【步骤1】【步骤2】用户访问客户端,需要使用服务提供商的数据(用户信息),客户端通过重定向跳转到服务提供商的页面

【步骤3】用户选择是否给予 客户端授权访问 服务提供商(用户信息)数据的权限

【步骤4】用户给予授权后,授权系统通过重定向(redirect_ui)并携带 访问令牌(access_token)跳转回客户端。

【步骤5】客户端携带access_token向资源服务器发出请求资源的请求

【步骤6】【步骤7】服务提供商的资源服务器返回数据给客户端使用

关键步骤:

步骤2:客户端申请认证的url,包含一下参数:

示例:A网站提供一个链接,用户点击后就会跳转到B网站,授权用户数据给A网站使用。下面就是A网站跳转B网站的一个示意链接:

https://b.com/oauth/authorize?client_id=p2pweb&response_type=token&scope=app&redirect_uri=http://xx.xx/notify

步骤3:用户跳转后,B网站会要求用户登录,然后询问是否同意给予A网站授权(此过程也可以自动授权,用户无感知)

步骤4:授权服务器将授权码将令牌(access_token)以Hash的形式存放在重定向uri的fargment中发送给浏览器。认证服务器回应客户端的URI,包含一下参数:

 

示例:

https://server.example.com/cb#access_token=ACCESS_TOKEN&state=xyz&token_type=example&expires_in=3600

https://a.com/callback#token=ACCESS_TOKEN

拓展:

1、Bearer Token(持有者令牌):Bearer类型的令牌是OAtuth2.0中最常见的一种类型。当客户端获得了Bearer令牌后,可以将其附和在请求的Authorization头部中,格式为“Bearer”,然后发送给资源服务器,以获取对受保护资源的访问。Bearer令牌通常以明文形式传输,因此在传输过程中需要采取适当的安全措施,如使用HTTPS

2、MAC Token(消息身份验证代码令牌):MAC类型的令牌也是一种用于访问受保护资源的令牌类型。MAC令牌采用了基于消息身份验证代码(Message Authentication Code ,MAC)的机制来验证客户端的请求,相比Bearer令牌更加安全。MAC令牌将访问令牌与秘钥相关联,并使用该秘钥进行签名,以确保请求的完整性和真实性。MAC令牌通常用于对安全性要求更高的场景。

3、在隐式授权模式中,当用户进行身份验证并授权后,授权服务器会将访问令牌直接返回给客户端。为了安全考虑,OAuth2.0规范建议将令牌放在URL锚点中,而不是放在查询字符串中。URL锚点是URL的一部分,用于标识页面中的特定位置,例如http://example.com/page#section.在浏览器发起HTTP请求时,锚点部分不会包含在请求中发送到服务器,这意味着在客户端和服务器之间传输时不会将令牌暴露给潜在的中间人(例如网络监听器或代理服务器)。因此,及时通过HTTP协议传输,也可以减少泄露令牌的风险。相比之下,查询字符串是URL中的一部分,用于传输参数给服务器,例如https://example.com/page?token=abc123.查询字符串中的参数会在HTTP请求中明文传输到服务器,存在被拦截和窃取的风险。因此,将访问令牌作为URL锚点的一部分返回给客户端,是为了增加安全。

4、授权码模式(Authrization Code)
第三方应用先申请一个授权码code,然后通过code获取令牌Access Token

授权码模式是功能最完全,流程最严密安全的授权模式。他的特点就是通过客户端的后台服务器,与“服务提供商”的认证服务器进行互动,access_token不会经过浏览器或移动端的App,而是直接从服务端去校验,这样就最大限度的减少了令牌泄露的风险。

流程:

操作步骤说明:

【步骤1】【步骤2】用户访问客户端,需要使用服务提供商的数据(用户信息),客户端通过重定向跳转到服务提供商页面。

【步骤3】用户选择是否给予客户端授权访问服务提供商(用户信息)数据的权限

【步骤4】用户给予授权。权限系统通过重定向(redirect_uri)并携带 授权凭证(code)跳转回客户端。

【步骤5】【步骤6】客户端将授权凭证(code)发送给客户端服务器,客户端服务器携带授权码(code)、客户端id(client_id)和秘钥(client_secret)向认证服务器请求访问令牌(access_token)

【步骤7】【步骤8】认证服务器核对授权码信息,确认无误后,向客户端服务器发送访问令牌(access_token)和更新令牌(refresh_token),然后这些信息在由客户端服务器发送给客户端

【步骤9】【步骤10】客户端持有访问令牌(access_token)和需要请求的参数向客户端服务器发起资源请求,然后客户端服务器在向服务提供商的资源服务器请求资源

【步骤11】【步骤12】【步骤13】服务提供商的资源服务器返回数据给客户端服务器,然后在回传给客户端使用

上述流程:只有第二步需要用户手动进行授权,之后的流程都是客户端的后台和认证服务器后台之间进行“静默”操作,对于用户来说是无感知的

关键步骤:

步骤2:客户端申请认证url,包含一下参数

步骤3:用户跳转后,B网站会要求用户登录,然后询问是否同意给予A网址授权(此过程也可以自动授权,用户无感知)

步骤4:服务器回应客户端的url,包含一下参数:

 

示例:在第2步用户同意之后,这时B网站就会跳回redirect_uri参数指定的网址。跳转时,会传回一个授权码,就像下面一样。

https://a.com/callback?code=AUTHORIZATION_CODE

 步骤6:客户端向认证服务器申请令牌

 

示例:在第6步骤中,A网站拿到授权码以后,就可以在后端,向B网站请求令牌

https://b.com/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

client_id参数和client_secret参数哟用来让B确认A的身份(client_secret参数是保密的,因此只能在后端发起请求)

grant_type参数的值是authorization_code,表示采用的授权方式是授权码

code参数是上一步拿到的授权码

redirect_uri参数是令牌颁发后的回调地址。

步骤7:认证服务器发送的HTTP回复,包含以下参数:

 

示例:在第7步骤中,B网站收到请求后,就会颁发令牌。具体做法是向 redirect_uri 指定的网址,发送一段JSON数据:

HTTP/1.1 200 OK

Content-Type: application/json;charset=UTF-8

Cache-Control: no-store

Pragma: no-cache

{"access_token":"ACCESS_TOKEN","token_type":"bearer","expires_in":2592000,"refresh_token":"REFRESH_TOKEN","scope":"read","uid":100101,"info":{...}

上面JSON数据中,access_token字段就是令牌。注意:HTTP头信息中明确指定不得缓存。


原文链接:https://blog.csdn.net/qq_52066082/article/details/137184381

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/44667.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

[转]32th@C++ 20新特性之线程与jthread@20240617

C++ 20新特性之线程与jthread为什么要引入jthread 在C++ 11中,已经引入了std::thread。std::thread为C++标准库带来了一流的线程支持,极大地促进了多线程开发的便利性。但std::thread也存在一些明显的不足和短板,主要有以下几点。 1、生命周期管理的复杂性。std::thread对象…

tableau 排序功能

1、嵌套:会按照当前数据总量,进行降序排列

IDEA中的Maven使用方法

详细麻瓜式教学,一学就会的maven教程原创:IDEA中的Maven使用方法😄一、IDEA中配置Maven配置(全局环境)打开idea,选择全局设置。2. 修改成maven本地存放路径,建议本地依赖存放到maven本地文件夹里的新建文件夹mvn_repo中。3. 打开runner目录,建议选择java开发版本17(sp…

Mybatis-Plus-Join(MPJ连表查询)

mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的联表查询能力一直被大家所诟病。一旦遇到left join或right join的左右连接,你还是得老老实实的打开xml文件,手写上一大段的sql语句 一款叫做mybatis-plus-join的工具(后面就…

什么是shell?

使用Mac系统的朋友应该比较熟悉Zsh和Bash这两个shell,但是对二者具体有什么区别可能不太了解。本文将从这两个shell入手,对相关概念以及二者区别进行解释。 1.什么是shell? shell 单词的本意是“壳子”,在计算机领域一样可以理解为机器外面的一层壳,目的是进行用于人机交互…

linux或者CentOS环境下安装.NET Core环境

一、下载 注册Microsoft密钥:在安装之前,需要: 1、注册Microsoft密钥 2、注册产品资料库 3、安装所需的依赖项打开终端并输入命令: sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm安装效果如下图所示:安装期间会提示用户验证…

AUTOSAR平台中的信息安全标准模块

目前,经纬恒润已为国内多家客户提供汽车网络安全开发及测试服务,打造车联网可信安全平台,为智能网联汽车安行之路保驾护航!面向MCU端的AUTOSAR CP平台加密组件——CryptoECU中所有的软件单元都遭受到信息安全攻击的可能。AUTOSAR为保障ECU信息和数据安全,定义了CRYPTO 组件…

如何通过一张图片判断摄影师的位置(图片经纬度转换)

目录通过图片属性中的经纬度计算拍照的位置(其实就是经纬度计算转换)一、 查看图片经纬度信息(只有原文件且拍照时开启了GPS才能看到这个信息)二、 通过经纬度计算地理位置三、 获得精确经纬度,在地图查询经纬度查询经纬度的链接 通过图片属性中的经纬度计算拍照的位置(其…