OAuth2.0入门

news2025/7/30 7:29:50

什么是OAuth2.0

OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。OAuth在全世界得到广泛应用,目前的版本是2.0版

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-epDpCXAl-1677206513697)(images\20220904204200.jpg)]

用户可以通过选择其他登录方式来使用gitee,这里就使用到了第三方认证。

来自RFC 6749

OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。…资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。

为什么要使用OAuth2.0

在OAuth之前,HTTP Basic Authentication, 即用户输入用户名,密码的形式进行验证, 这种形式是不安全的。OAuth的出现就是为了解决访问资源的安全性以及灵活性。OAuth使得第三方应用对资源的访问更加安全。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aY1j7Hx1-1677206513701)(images\20220904214709.jpg)]

小静现在想要将手机云中的相册美照,放置到QQ空间中展示,按照传统方式小静要怎么做呢?

  • 将照片从“手机云”中download下来,在上传到“QQ空间相册”展示。
  • 下载/上传太麻烦了,小静可以直接把“云相册”的账号和密码告诉“QQ空间”,由“QQ空间”下载照片在上传。

对于上面的两种方法,方法一太麻烦但是相对于小静来说是安全的;方法二对于小静是比较方便,但是将账号密码告诉了“QQ空间”就相当于把所有的“手机云”资料交给了它,这肯定是不可取的。

所以,为了解决类似上面的问题,Oauth协议诞生了。

OAuth2.0协议流程

应用场景

  • 原生app授权:app登录请求后台接口,为了安全认证,所有请求都带token信息,如果登录验证、 请求后台数据。
  • 前后端分离单页面应用:前后端分离框架,前端请求后台数据,需要进行oauth2安全认证
  • 第三方应用授权登录,比如QQ,微博,微信的授权登录。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jon1KTBw-1677206513702)(images\20220903225212.jpg)]

步骤解读:

第1步:浏览器打开Gitee码云,点击微信方式授权登录,重定向到微信授权服务页面等待获取授权码;

第2步:用户打开手机登录微信扫描“二维码”,点击“允许”授权,将重定向到客户端(Gitee)应用提供的URI;

第3步:客户端(Gitee)使用上一步获取的授权码,向微信授权服务器申请令牌(Token);

第4步:微信授权服务器对客户端(Gitee)进行认证以后,确认无误,同意发放令牌;

第5步:客户端使用令牌向资源服务器(微信)申请获取资源;

第6步:资源服务器(微信)确认令牌无误后,同意向客户端开放资源;

角色

  • Third-party application:第三方应用程序,又称"客户端"(client),即例子中的"Gitee"。
  • HTTP service:HTTP服务提供商,简称"服务提供商",即例子中的微信。
  • Resource Owner:资源所有者,又称"用户",也就是你(user)。
  • User Agent:用户代理,比如浏览器。
  • Authorization server:授权服务器,即服务提供商专门用来处理认证授权的服务器。
  • Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与授权服务器,可以是同一台服务器,也可以是不同的服务器。

OAuth的作用就是让"客户端"安全可控地获取"用户"的授权,与"服务提供商"进行交互。

认证流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4e0sGtdE-1677206513704)(images\20220904223145.jpg)]

(A)用户打开客户端以后,客户端要求用户给予授权。

(B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。

上面六个步骤之中,B是关键,即用户怎样才能给于客户端授权。有了这个授权以后,客户端就可以获取令牌,进而凭令牌获取资源。

令牌的特点

  • 令牌又时效性,一般是短期的,且不能修改,密码一般是长期有效的
  • 令牌可以由颁发者撤销,且即时生效,密码一般可以不用修改而长期有效
  • 令牌可以设定权限的范围,且使用者无法修改

在使用令牌时需要保证令牌的保密,令牌验证有效即可进入系统,不会再做其他的验证。

OAuth2.0授权模式

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0一共分成四种授权类型(authorization grant)

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

授权码模式和密码模式比较常用。

授权码模式

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

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

适用场景:目前主流的第三方验证都是采用这种模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQJT248o-1677206513706)(images\b72d01fb2087d255aca6a25106add204.png)]

主要流程:

(A)用户访问客户端,后者将前者导向授权服务器。

(B)用户选择是否给予客户端授权。

(C)用户给予授权,授权服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

(D)客户端收到授权码,附上早先的"重定向URI",向授权服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

(E)授权服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

请求示例:

  • (A)步骤:客户端申请认证的URI
https://www.example.com/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read&state=xxx

参数说明:

参数类型说明
response_type授权类型,必选项,此处的值固定为"code"
client_id客户端的ID,必选项
redirect_uri重定向URI,认证服务器接受请求之后的调转连接,可以根据这个连接将生成的授权码回传,必选项
scopecode发送给资源服务器申请的权限范围,可选项
state任意值,认证服务器会原样返回,用于抵制CSRF(跨站请求伪造)攻击。
  • (C)步骤:服务器回应客户端的URI
https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xxx

参数说明:

参数类型说明
code授权码,必选项。授权码有效期通常设为10分钟,一次性使用。该码与客户端ID、重定向URI以及用户,是一一对应关系。
state原样返回客户端传的该参数的值
  • (D)步骤:客户端向认证服务器申请令牌
https://www.example.com/v1/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

参数说明:

参数类型说明
client_id表示客户端ID,必选项
client_secret表示安全参数,只能在后端发请求
grant_type表示使用的授权模式,必选项,此处的值固定为"authorization_code"
code表示上一步获得的授权码,必选项
redirect_uri表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致
  • (E)步骤:响应(D)步骤的数据
{ 
	"access_token":访问令牌, 
	"token_type":"bearer", 
	"expires_in":过期时间, 
	"refresh_token":"REFRESH_TOKEN", 
	"scope":"read", 
	"uid":用户ID,
    "info":{...} 
}

参数说明:

参数类型说明
access_token访问令牌,必选项
token_type令牌类型,该值大小写不敏感,必选项
expires_in过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间
refresh_token更新令牌,用来获取下一次的访问令牌,可选项
scope权限范围,如果与客户端申请的范围一致,此项可省略

**简化(隐式)**模式

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

简化模式不通过第三方应用程序的服务器,直接在浏览器中向授权服务器申请令牌,跳过了"授权码"这个步骤,所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

这种方式把令牌直接传给前端,是很不安全的。因此,只能用于一些安全要求不高的场景,并且令牌的有效期必须非常短,通常就是会话期间(session)有效,浏览器关掉,令牌就失效了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EUsMyBK4-1677206513707)(images\eb7786c4ee86e32d8049d7384e3c3084.png)]

(A)客户端将用户引导向认证服务器。

(B)用户决定是否给于客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端指定的”重定向URI",并在URI的Hash部分包含了访问令牌。

(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。

(E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。

(F)浏览器执行上一步获得的脚本,提取出令牌。

(G)浏览器将令牌发给客户端。

密码模式

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

在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而授权服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

适用场景:公司搭建的授权服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCwUaLSP-1677206513708)(images\dd583dd0c4860ad42f7ff0026ead9a61.png)]

(A)用户向客户端提供用户名和密码。

(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。

(C)认证服务器确认无误后,向客户端提供访问令牌。

客户端模式

客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行 授权。

**适用于没有前端的命令行应用,即在命令行下请求令牌。**一般用来提供给我们完全信任的服务器端服务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LcBgamRU-1677206513710)(images\d26678b396cc68436fcda1319766aa49.png)]

(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。

(B)认证服务器确认无误后,向客户端提供访问令牌。

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

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

相关文章

HTML基础(3)

HTML基础单选框、复选框、下拉框文本框< script >标签属性< script >基本使用单选框、复选框、下拉框 文本框 < script >标签属性 type属性定义script元素包含或src引用的脚本语言。属性值是MIME类型&#xff0c;包括text/javascript,text/ecmascript, appl…

SpringBoot2零基础到项目实战-基础篇

SSM内容01-SpringBoot工程入门案例开发步骤SpringBoot 是 Pivotal 团队提供的全新框架&#xff0c;设计目的是简化 Spring 应用的初始搭建以及开发过程。使用了 Spring 框架后已经简化了我们的开发。而 SpringBoot 又是对 Spring 开发进行简化的&#xff0c;可想而知 SpringBoo…

使用DQN进行价格管理

文章目录前言一、不同的价格响应二、利用DQN优化定价策略1.定义环境2.DQN算法概述3.Algorithm: Deep Q Network (DQN)总结强化学习-定价、决策前言 供应链和价格管理是企业运营中最早采用数据科学和组合优化方法的领域&#xff0c;并且在使用这些技术方面有着悠久的历史&#…

RabbitMQ 实现延迟队列

业务场景&#xff1a;1.生成订单30分钟未支付&#xff0c;则自动取消&#xff0c;我们该怎么实现呢&#xff1f;2.生成订单60秒后,给用户发短信1 安装rabbitMqwindows安装ubuntu中安装2 添加maven依赖<!-- https://mvnrepository.com/artifact/org.springframework.boot/spr…

内网渗透(五十四)之域控安全和跨域攻击-利用krbtgt哈希值获取目标域控

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

sqlmap工具

sqlmap Sqlmap是一个开源的渗透测试工具&#xff0c;可以用来自动化的检测&#xff0c;利用SQL注入漏洞&#xff0c;获取数据库服务器的权限。目前支持的数据库有MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access等大多数据库 Sqlmap采用了以下5种独特的SQ…

2023年,拥有软考证书在这些地区可以领取福利补贴

众所周知&#xff0c;软考的含金量很高&#xff0c;比如可以入户、领取技能补贴、抵扣个税、以考代评、招投标加分&#xff0c;入专家库… 今天小编给大家收集了拥有软考证书可以领取软考福利的地区&#xff0c;希望对大家有所帮助&#xff01; 【深圳】 入户 ①核准类入户:…

C++【模板STL简介】

文章目录C模板&&STL初阶一、泛型编程二、函数模板2.1.函数模板概念2.2.函数模板格式2.3.函数模板的实例化2.4.模板参数的匹配原则三、 类模板3.1.模板的定义格式3.2.类模板的实例化STL简介一、STL的概念、组成及缺陷二、STL的版本C模板&&STL初阶 一、泛型编程…

AcWing蓝桥杯辅导课:第一讲递推与递归

AcWing 92. 递归实现指数型枚举 思路&#xff1a; 方法一&#xff1a; 暴力枚举 用二进制加位运算枚举每一个状态&#xff0c;输出即可&#xff0c;时间复杂度为 O(N2N)O(N2^N)O(N2N) 代码&#xff1a; import java.util.Scanner;/*** Description* Author: PrinceHan* Cre…

如何让WinForms应用程序拥有Windows 11设计主题?

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件。所有的UI for WinForms控件都具有完整的主题支持&#xff0c;可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。Windows 11主题的时代已经到来了&#xff0c;可以为WinF…

Vue+Spring Boot前后端开发手册,开源获赞68K

企业技能要求 现在企业通常要求程序员既要有实战技能&#xff0c;也要内功扎实&#xff0c;对于新项目可以快速上手&#xff0c;熟悉底层原理后还应后劲十足&#xff0c;因此在笔试和面试时结合底层知识、实战应用、设计思维三方面进行考查。针对这3个方面的需求&#xff0c;阿…

【Java】用记事本实现“HelloWorld”输出

【在进行以下操作前需要下载好JDK并配置好对应的环境变量】 一、在任意文件夹中创建一个新的文本文档文件并写入以下代码 public class Hello{public static void main (String[] args){System.out.print("Hello,World!");} } 二、修改文件名称及文件类型为 Hello.j…

Python3,为了无损压缩gif动图,我不得不写了一个压缩神器,真香。

gif动图无损压缩1、引言2、代码实战2.1 模块介绍2.2 安装2.3 代码示例3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 求助~ 求助~ 求助~ 小鱼&#xff1a;你这是告诉我&#xff0c;重要的事情 说三遍吗&#xff1f; 小屌丝&#xff1a;你可以这么理解。 小鱼&#xff1a…

程序员35岁以后就没有出路了吗?听听京东10年测开的分析

国内的互联网行业发展较快&#xff0c;所以造成了技术研发类员工工作强度比较大&#xff0c;同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高&#xff0c;超过35岁的基层研发类员工&#xff0c;往往因为家庭原因、身体原因&#xff0c;比较难以跟得上工作…

RocketMQ 延迟队列

什么是延迟队列指消息发送到某个队列后&#xff0c;在指定多长时间之后才能被消费。应用场景RocketMQ 延迟队列定时消息&#xff08;延迟队列&#xff09;是指消息发送到broker后&#xff0c;不会立即被消费&#xff0c;等待特定时间投递给真正的topic。broker有配置项messageD…

自学黑客2年都没入门,从零入门渗透有那么难吗?附入门教程。

最近年底了&#xff0c;不少朋友都是在总结一年的学习成果。最后不少人发现完成情况与自己最初定下的目标相去甚远。 我认识不少人自学大半年了&#xff1a;b站&#xff0c;网盘&#xff0c;各种各样的资源数不胜数&#xff0c;总之只要是跟安全相关的不管学不学&#xff0c;先…

IP地址,子网掩码,网段 概念详解

文章目录1. 子网掩码1.1 子网掩码的概念及作用1.2 子网掩码的组成1.3 子网掩码的表示方法1.4 为什么要使用子网掩码&#xff1f;1.5 子网掩码的分类2. 子网掩码和IP地址的关系2.1 根据掩码确定网段IP地址是以 网络号和 主机号来标示网络上的主机的&#xff0c;我们把网络号相同…

「JVM 编译优化」Graal 编译器

文章目录1. 历史背景2. 构建编译调试环境3. JVMCI 编译器接口4. 代码中间表示5. 代码优化与生成1. 历史背景 Graal 编译器在 JDK 9 以 Jaotc 提前编译工具的形式首次加入到官方的 JDK 中&#xff0c;JDK 10 开始提供替换&#xff08;得益于 HotSpot 编译器接口&#xff0c;Jav…

vue中的key值

1. 什么是key&#xff1f; 当我们对一个数据进行遍历生成DOM时&#xff0c;vue的内部会根据索引号对其进行key的定义&#xff0c;而key会作为每一个新生成DOM的唯一标识。 2.为什么不建议索引值作为key&#xff1f; 很多人喜欢直接使用索引值作为key&#xff0c;当所遍历的数…

项目缓存问题处理

1、public/index.html文件头部配置 <meta http-equiv"pragram" content"no-cache"> <meta http-equiv"cache-control" content"no-cache,no-store,must-revalidate"> <meta http-equiv"expires" content&…