OAuth2.0登录的四种方式

OAuth登录的四种方式

1. 授权码

授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。

这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。

例如,有一个网站A(高德地图),需要向网站B(微博)授权登录

1705567996465.png

第一步,拿到授权码

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

https://api.weibo.com/oauth2/authorize?
client_id=884965267
&redirect_uri=https%3A%2F%2Fid.amap.com%2Findex%2Fweibo%3Fpassport%3D1

client_id客户端id,redirect_uri跳转链接

第二步,在用户跳转后,B 网站会要求用户登录,然后询问是否同意给予 A(高德) 网站授权。用户表示同意,这时 B (微博)网站就会跳回redirect_uri参数指定的网址。

1705568068369.png

跳转时,会传回一个授权码,就像下面这样。

https%3A%2F%2Fid.amap.com%2Findex%2Fweibo%3Fpassport%3D1?
code=******

第三步,A (高德)网站拿到授权码以后,就可以在后端,向 B (微博)网站请求令牌。

https://api.weibo.com/oauth2/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

上面的url中,client_id参数和client_secret参数用来让 B(微博) 确认 A(高德) 的身份(client_secret参数是保密的,因此只能在后端发请求),grant_type参数的值是AUTHORIZATION_CODE,表示采用的授权方式是授权码,code参数是上一步拿到的授权码,redirect_uri参数是令牌颁发后的回调网址。

第四步,B(微博) 网站收到请求以后,就会颁发令牌。具体做法是向redirect_uri指定的网址,发送一段 JSON 数据。

例如:

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

access_token就是我们所需要的令牌,这个信息在A(高德)网站的后端得到,即可进行用户的登录认证

因此,这种方式的登录模式图为:1705568104946.png

这种登录一般应用于前后端分离登录,安全性非常的高,使用也是最广泛的一种

2. 隐藏式

有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)"隐藏式"(implicit)。

第一步:A 网站提供一个链接,要求用户跳转到 B 网站,授权用户数据给 A 网站使用。

https://b.com/oauth/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read

上面 URL 中,response_type参数为token,表示要求直接返回令牌。

第二步:用户跳转到 B 网站,登录后同意给予 A 网站授权。这时,B 网站就会跳回redirect_uri参数指定的跳转网址,并且把令牌作为 URL 参数,传给 A 网站。

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

上面 URL 中,token参数就是令牌,A 网站因此直接在前端拿到令牌。

1705568127815.png

这种方式的相对于上一种方式,更加简单,但是也更加不安全,所有的代码和登录都写在前端页面中,容易被他人破解,所以一般用于安全性不高的地方。

3. 密码式

如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password)。

第一步,A 网站要求用户提供 B 网站的用户名和密码。拿到以后,A 就直接向 B 请求令牌。(后端调用该接口)

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

上面 URL 中,grant_type参数是授权方式,这里的password表示"密码式",usernamepassword是 B 的用户名和密码。

第二步,B 网站验证身份通过后,直接给出令牌。注意,这时不需要跳转,而是把令牌放在 JSON 数据里面,作为 HTTP 回应,A 因此拿到令牌。

这种方式风险很大,需要直接提供账号密码,所以只适用于其他授权方式都无法采用的情况,而且必须是用户高度信任的应用。

4. 凭证式

最后一种方式是凭证式(client credentials),适用于没有前端的命令行应用,即在命令行下请求令牌。

第一步,A 应用在命令行向 B 发出请求。

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

上面 URL 中,grant_type参数等于client_credentials表示采用凭证式,client_idclient_secret用来让 B 确认 A 的身份。

第二步,B 网站验证通过以后,直接返回令牌。

这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。

这种认证场景通常用于调用第三方接口,例如调用阿里云的短信接口等等

文章参考OAuth 2.0 的四种方式

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++关于计算浮点数小数位数时遇到的浮点数精确度问题(以及浮点数强制转换问题)

起因是当我想要计算浮点数的小数位位数(利用当浮点数num减去其整数位 ) 我的想法是先分离出小数位,然后每次循环给小数位乘上10,直到不存在小数位时,就会满足当num - (int)num == 0通过这种方式就可以得到小数位的长度 #include <iostream> using namespace std; in…

codeforces 955 div 2 D

题目链接 D. Beauty of the mountains 题目大意解题思路 首先记录所有雪山和没有雪山两种山峰的高度差为 \(tot\) ,然后对于每个可能的子矩,我们可以每次给所有山峰都加一或者减一,因此只要计算出矩阵内两种山峰的个数差的绝对值我们就能得到每次操作该子矩阵对tot的贡献 \(…

全局ID工具类

测试方法学习: 定义一个任务(生成id),执行300次,让不同线程执行这300次,用线程池对象的submit方法。心甘情愿做你现在想做的每一件事。

Dubbo源码学习

学习Dubbo框架与手写模拟相关内容 一、存在的意义 Dubbo:解决分布式系统的复杂性,实现服务治理(使服务之间的调用变的简单)和自动注册与发现,简化服务调用。 二、调用过程Dubbo的使用 接口代表一种服务,对应不同的实现,使服务之间的依赖变的简单。 服务消费者通过ClassP…

软件测试的分类and测试进阶路线

本文来自博客园,作者:子沐呐吖,转载请注明原文链接:https://www.cnblogs.com/SuperLee017/p/18292404

使用资源编排 ROS 轻松部署单点网站——以 WordPress 为例

介绍 WordPress是一款免费开源的网站内容管理系统(CMS),它可以帮助用户简单快捷地创建和管理自己的网站,包括博客、新闻网站、电子商务网站、社交网络等等。WordPress 有丰富的主题和插件库,使得用户可以轻松地为网站定制外观和功能。WordPress 的易用性和可扩展性使其成为…

[Java SE] Java-文件系统-常用文件路径的获取方法

1 获取相对路径 /*** 获取相对路径 【推荐】* 使用Java提供的Path类和Paths类来获取相对路径。* 例如,假设有两个路径a和b,我们可以使用Path类的relativize()方法来获取相对路径,该方法返回一个相对路径的Path对象。*/ @Test public void getRelativePathTest1(){Path pathA…

CH582 CH592 CH573 BLE central主机获取handle值

GATT_DiscCharsByUUID和GATT_ReadUsingCharUUID 差异

[深入理解Java虚拟机]Java内存模型

Java内存模型 概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能了。在许多场景下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统的速度差距太大,大量的时间都花费在磁盘I/O、网络…

深入理解 DB-GPT

DB-GPT 项目介绍 DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL(Agentic Workflow Expression Language) and Agents)。目的是构建大模型领域的基础设施,通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Mult…

2024年国内最经典好用的5款项目管理软件工具助你一路长虹

目前市场上的项目管理软件众多,但是它们也都有一些共同的功能及特点。比如任务和进度管理、资源分配、财务监控、风险评估、协作增强以及报告和洞察力等。这些功能不仅提供了强大的工具来确保项目的高效执行和按时交付,而且还为团队成员和管理者提供了实时的数据和信息,帮助…