当前位置:网站首页>OAuth2:四种授权方式
OAuth2:四种授权方式
2022-07-31 14:05:00 【Leon_Jinhai_Sun】
OAuth 2.0 实现单点登录
注意:第一次接触可能会比较难,不太好理解,需要多实践和观察。
前面我们虽然使用了统一存储来解决Session共享问题,但是我们发现就算实现了Session共享,依然存在一些问题,由于我们每个服务都有自己的验证模块,实际上整个系统是存在冗余功能的、同时还有我们上面出现的问题,那么能否实现只在一个服务进行登录,就可以访问其他的服务呢?
实际上之前的登录模式称为多点登录,而我们希望的是实现单点登陆,因此,我们得找一个更好的解决方案。
这里我们首先需要了解一种全新的登录方式:OAuth 2.0,我们经常看到一些网站支持第三方登录,比如淘宝、咸鱼我们就可以使用支付宝进行登录,腾讯游戏可以用QQ或是微信登陆,以及微信小程序都可以直接使用微信进行登录。我们知道它们并不是属于同一个系统,比如淘宝和咸鱼都不属于支付宝这个应用,但是由于需要获取支付宝的用户信息,这时我们就需要使用 OAuth2.0 来实现第三方授权,基于第三方应用访问用户信息的权限(本质上就是给别人调用自己服务接口的权限),那么它是如何实现的呢?
四种授权模式
我们还是从理论开始讲解,OAuth 2.0一共有四种授权模式:
- 客户端模式(Client Credentials)
这是最简单的一种模式,我们可以直接向验证服务器请求一个Token(这里可能有些小伙伴对Token的概念不是很熟悉,Token相当于是一个令牌,我们需要在验证服务器(User Account And Authentication)服务拿到令牌之后,才能去访问资源,比如用户信息、借阅信息等,这样资源服务器才能知道我们是谁以及是否成功登录了)
当然,这里的前端页面只是一个例子,它还可以是其他任何类型的客户端,比如App、小程序甚至是第三方应用的服务。
虽然这种模式比较简便,但是已经失去了用户验证的意义,压根就不是给用户校验准备的,而是更适用于服务内部调用的场景。
- 密码模式(Resource Owner Password Credentials)
密码模式相比客户端模式,就多了用户名和密码的信息,用户需要提供对应账号的用户名和密码,才能获取到Token。
虽然这样看起来比较合理,但是会直接将账号和密码泄露给客户端,需要后台完全信任客户端不会拿账号密码去干其他坏事,所以这也不是我们常见的。
- 隐式授权模式(Implicit Grant)
首先用户访问页面时,会重定向到认证服务器,接着认证服务器给用户一个认证页面,等待用户授权,用户填写信息完成授权后,认证服务器返回Token。
它适用于没有服务端的第三方应用页面,并且相比前面一种形式,验证都是在验证服务器进行的,敏感信息不会轻易泄露,但是Token依然存在泄露的风险。
- 授权码模式(Authrization Code)
这种模式是最安全的一种模式,也是推荐使用的一种,比如我们手机上的很多App都是使用的这种模式。
相比隐式授权模式,它并不会直接返回Token,而是返回授权码,真正的Token是通过应用服务器访问验证服务器获得的。在一开始的时候,应用服务器(客户端通过访问自己的应用服务器来进而访问其他服务)和验证服务器之间会共享一个secret
,这个东西没有其他人知道,而验证服务器在用户验证完成之后,会返回一个授权码,应用服务器最后将授权码和secret
一起交给验证服务器进行验证,并且Token也是在服务端之间传递,不会直接给到客户端。
这样就算有人中途窃取了授权码,也毫无意义,因为,Token的获取必须同时携带授权码和secret,但是secret
第三方是无法得知的,并且Token不会直接丢给客户端,大大减少了泄露的风险。
但是乍一看,OAuth 2.0不应该是那种第三方应用为了请求我们的服务而使用的吗,而我们这里需要的只是实现同一个应用内部服务之间的认证,其实我也可以利用 OAuth2.0 来实现单点登录,只是少了资源服务器这一角色,客户端就是我们的整个系统,接下来就让我们来实现一下。
边栏推荐
- 拥塞控制,CDN,端到端
- Miller_Rabin 米勒拉宾概率筛【模板】
- 【Pytorch】torch.argmax()用法
- 49. The copy constructor and overloaded 】
- The batch size does not have to be a power of 2!The latest conclusions of senior ML scholars
- Four ways to clear the float and its principle understanding
- ICML2022 | Fully Granular Self-Semantic Propagation for Self-Supervised Graph Representation Learning
- I summed up the bad MySQL interview questions
- MySQL玩到这种程度,难怪大厂抢着要!
- el-tooltip的使用
猜你喜欢
代码随想录笔记_哈希_454四数相加II
我把问烂了的MySQL面试题总结了一下
232层3D闪存芯片来了:单片容量2TB,传输速度提高50%
Reasons and solutions for Invalid bound statement (not found)
机器学习模型验证:被低估的重要一环
Miller_Rabin Miller Rabin probability sieve [template]
Open Inventor 10.12 Major Improvements - Harmony Edition
The pre-sale of the new Hyundai Paristi is open, and safety and comfort are not lost
4.爬虫之Scrapy框架2数据解析&配置参数&数据持久化&提高Scrapy效率
C# control StatusStrip use
随机推荐
[Pytorch] torch.argmax() usage
技能大赛训练题:ftp 服务攻防与加固
Resnet&API
Small test knife: Go reflection helped me convert Excel to Struct
[QNX Hypervisor 2.2 User Manual]9.14 safety
Open Inventor 10.12 Major Improvements - Harmony Edition
Shang Silicon Valley-JVM-Memory and Garbage Collection (P1~P203)
以后面试官问你 为啥不建议使用Select *,请你大声回答他!
“听我说谢谢你”还能用古诗来说?清华搞了个“据意查句”神器,一键搜索你想要的名言警句...
技能大赛训练题:登录安全加固
AWS implements scheduled tasks - Lambda+EventBridge
csdn发文助手问题
IDEA can't find the Database solution
Detailed guide to compare two tables using natural full join in SQL
我把问烂了的MySQL面试题总结了一下
The JVM a class loader
IDEA connects to MySQL database and uses data
The batch size does not have to be a power of 2!The latest conclusions of senior ML scholars
The Selenium IDE of the Selenium test automation
jOOQ 3.14 released - SQL/XML and SQL/JSON support