OAuth 2.0 协议介绍【实现 GitHub 第三方登录】

OAuth(是 Open Authorization 开放授权的缩写),在全世界得到广泛应用,目前的版本是2.0版。

本文会对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。

OAuth 2.0 是一个开放标准,用于授权用户访问另一个应用程序的资源,而无需将用户的凭据(比如用户名和密码)直接提供给第三方应用。它被广泛应用于各种网络服务,如社交媒体、云存储和在线支付等领域。

1. 不使用 OAuth 有什么问题?

举个简单的例子,就比如我们的应用程序想要获取 GitHub 用户的仓库信息,但是 GitHub 不允许外部网站直接读取用户的仓库信息,换言之就是需要用户授权我们的应用程序才能读取到用户的仓库信息。

那么我们的应用程序怎么获取到用户的授权呢?

传统的做法是让用户提供 GitHub 账号和密码给我们的应用程序,这样我们就可以读取仓库信息了。但是这样有几个缺陷:

(1)我们的应用程序为了不定期的获取仓库信息,会保存用户的密码,这样很不安全。

(2)GitHub 不得不部署密码登录,但是单纯的密码登录并不安全。

(3)我们的应用程序相当于拥有了用户的账号,用户没法限制应用程序的授权范围和有效期。

(4)用户只有修改密码才能收回应用程序的权力,但是修改密码会使得其他的第三方应用程序失效。

(5)只要有一个应用程序被破解,用户的密码就会被泄漏,所有受密码保护的数据也就会跟着泄漏。

OAuth 就是为了解决上面这些问题而诞生的。

2. 有关的名词、术语

在详细讲解 OAuth 之前,需要了解几个名词。这对我们后续的理解至关重要!

名词、术语解释
Authorization server授权服务器,验证资源所有者并获得授权。验证成功后向客户端颁发访问令牌的服务器。
Resource server资源服务器,托管受保护资源的服务器,接收并响应携带访问令牌的资源请求。
Resource Owner资源所有者,一种能够授予对受保护资源的访问权限的实体。
Client代表发出受保护资源请求的应用程序,比如我们开发的网站就是这里说的应用程序。

授权服务器可以是与资源服务器相同的服务器,也可以是单独的实体。单个授权服务器发布的访问令牌能被多个资源服务器所接受。

3. OAuth 协议流程

Abstract Protocol Flow.png

上图展示了这四个角色之间是如何交互的。相关步骤详细解释如下:

(A):客户端向资源所有者请求授权()。授权请求可以直接向资源所有者发起,或者通过作为中介的授权服务器间接发起。比如我们点击 GitHub 登录时,会跳往一个页面让我们进行授权。

GitHub 授权.png

(B):客户端接收授权授予(Authorization Grant),该授权授予是表示资源所有者的授权的凭证。比如我们请求 GitHub 授权页面后,点击授权按钮之后,会返回一个 code(授权码),这就是授权的凭证。

(C):客户端请求授权服务器,并出示授权授予,如果通过身份验证授权服务器会返回访问令牌(Access Token)。如果在我们的应用程序中的话,这里是后端服务器向授权服务器发送请求,并携带 client_idclient_srcret 两个字段。

(D):授权服务器对客户端进行身份验证并验证授权授予,如果授权授予有效,则颁发访问令牌。

(E):客户端向资源服务器请求受保护的资源,并通过提供访问令牌进行身份验证。

(F):资源服务器验证访问令牌,如果访问令牌有效,则为客户端提供服务。

4. 授权授予(Authorization Grant)

授权授予是表示资源所有者的授权(访问其受保护的资源)的凭证,客户端使用该授权来获得访问令牌。该规范定义了四种授予类型——授权码、隐式授权、资源所有者密码凭据和客户端凭据——以及用于定义其他类型的可扩展性机制。

4.1. 授权码(Authorization Code)

相比其他的授权方式,这种方法是最安全的,也是使用最多的授权方式。这也是我们主要介绍的第三方登录授权方式。

授权码是通过使用授权服务器作为客户端和资源所有者之间的中介来获得的。客户端不是直接向资源所有者请求授权,而是将资源所有者引导到授权服务器(通过其在 [RFC2616] 中定义的用户代理),授权服务器又将资源所有者用授权码引导回客户端。

在使用授权码将资源所有者引导回客户端之前,授权服务器对资源所有者进行身份验证并获得授权。因为资源所有者只通过授权服务器进行身份验证,所以资源所有者的凭据永远不会与客户端共享。

授权码提供了一些重要的安全优势,例如对客户端进行身份验证的能力,以及将访问令牌直接传输到客户端,而无需通过资源所有者的用户代理将其传递给其他人,包括资源所有者。

4.2. 隐式授权(Implicit)

隐式授权是针对使用诸如 JavaScript 之类的脚本语言在浏览器中实现的客户端而优化的简化授权代码流。在隐式流中,不是向客户端颁发授权码,而是直接向客户端颁发访问令牌

作为资源所有者授权的结果。授予类型是隐式的,因为没有颁发中间凭证(如授权码)。

在隐式授予流期间颁发访问令牌时,授权服务器不会对客户端进行身份验证。在某些情况下,可以通过用于向客户端传递访问令牌的重定向URI来验证客户端身份。访问令牌可以被暴露给资源所有者或具有对资源所有者的用户代理的访问权的其他应用。

隐式授权提高了一些客户端(例如作为浏览器内应用程序实现的客户端)的响应能力和效率,因为它减少了获得访问令牌所需的往返次数。然而,这种便利性应与使用隐式授权的安全影响进行权衡,尤其是当授权码授权类型可用时。

4.3. 资源所有者密码凭据(Resource Owner Password Credentials)

资源所有者密码凭据(即用户名和密码)可以直接用作获得访问令牌的授权授予。只有当资源所有者和客户端之间存在高度信任时(例如,客户端是设备操作系统或高特权应用程序的一部分),以及当其他授权授予类型不可用时(例如授权码),才可以使用资源所有者密码凭据。

即使此授予类型要求客户端直接访问资源所有者凭据,资源所有者凭据被用于单个请求,并交换为访问令牌。这种授权类型可以通过与长期访问令牌或刷新令牌交换凭据,消除客户端存储资源所有者凭据以供将来使用的需要。

4.4. 客户端凭据(Client Credentials)

当授权范围仅限于客户端控制下的受保护资源,或仅限于先前与授权服务器安排的受保护资源时,客户端凭据(或其他形式的客户端身份验证)可用作授权授予。通常,当客户端代表自己行事(客户端也是资源所有者)或根据先前与授权服务器安排的授权请求访问受保护资源时,客户端凭据可用作授权授予。

5. 访问令牌(Access Token)

访问令牌是用于访问受保护资源的凭据。访问令牌是表示颁发给客户端的授权的字符串。访问令牌通常对客户端是不透明的。令牌表示特定的访问范围和持续时间,由资源所有者授予,并由资源服务器和授权服务器强制执行。

令牌可以表示用于检索授权信息的标识符,或者能以可验证的方式包含授权信息(即由一些数据和签名组成的令牌)。

访问令牌提供了一个抽象层,用资源服务器可以理解的单个令牌替换不同的授权结构(例如,用户名和密码)。这种抽象使得发布访问令牌比用于获取它们的授权授予更具限制性,并消除了资源服务器理解广泛身份验证方法的需要。

基于资源服务器安全要求,访问令牌可以具有不同的格式、结构和使用方法(例如,加密属性)。

6. 刷新令牌(Refresh Token)

刷新令牌是用于获取访问令牌的凭据。刷新令牌由授权服务器颁发给客户端,用于在当前访问令牌无效或过期时获得新的访问令牌,或者用于获得具有相同或更窄范围的附加访问令牌(访问令牌的生存期可能比资源所有者授权的生存期更短,权限更少)。根据授权服务器的判断,发布刷新令牌是可选的。如果授权服务器发布刷新令牌,则在发布访问令牌时会包含刷新令牌。

刷新令牌是一个字符串,表示资源所有者授予客户端的授权。刷新令牌通常对客户端是不透明的。令牌表示用于检索授权信息的标识符。与访问令牌不同,刷新令牌只会发送给授权服务器,不会发送给资源服务器。

Refreshing an Expired Access Token.png

上图是获取刷新令牌,以及通过刷新令牌来获取访问令牌的流程,详细的解释如下:

(A):客户端通过向授权服务器进行身份验证并提供授权授权来请求访问令牌。在这步之前还有用户授权的流程,该流程在这里被省略。

(B):授权服务器对客户端进行身份验证并验证授权授予,如果授权授予有效,则颁发访问令牌和刷新令牌。

(C):客户端通过提供访问令牌向资源服务器获取受保护的资源。

(D):资源服务器验证访问令牌,如果有效,则为请求提供响应数据。

(E):重复步骤(C)和(D),直到访问令牌到期。如果访问令牌过期,则跳到步骤(G);否则,它会发出另一个获取受保护的资源的请求。

(F):如果访问令牌无效(可能是访问令牌到期),资源服务器返回一个访问令牌错误的信息。

(G):客户端通过向授权服务器进行身份验证并呈现刷新令牌来请求新的访问令牌。客户端身份验证要求基于客户端类型和授权服务器的策略。

(H):授权服务器对客户端进行身份验证并验证刷新令牌,如果有效,则发布新的访问令牌(以及可选的新的刷新令牌)。

7. 结语

该文章主要介绍了一些 OAuth 2.0 的名词和术语。如果大家对 OAuth 感兴趣的话,后面我们还会讲解 OAuth 的使用。我们会以 GitHub 为例来实现第三方登录。

具体的代码我已经写好了,项目地址:实现 GitHub 第三方登录

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

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

相关文章

问题:实行网络化管理,为此需要做好以下几个方面的工作。() #知识分享#其他#职场发展

问题:实行网络化管理,为此需要做好以下几个方面的工作。() A、建立“公共部门—私人部门—第三部门”的合作网络 B、采用平等协商、双向互动、共同参与的决策方式,参与式决策应当成为网络化管理中的主要决策方式 C、建立“公共部门—私人部…

寒假学习记录17:包管理器(包管理工具)

概念 包(package) 包含元数据的库,这些元数据包括:名称,描述,git主页,许可证协议,作者,依赖..... 库(library,简称lib) 以一个或多个模…

算法刷题day13

目录 引言一、蜗牛 引言 今天时间有点紧,只搞了一道题目,不过确实搞了三个小时,才搞完,主要是也有点晚了,也好累啊,不过也还是可以的,学了状态DP,把建图和spfa算法熟悉了一下&#…

c语言(指针进阶)

指针 一.什么是字符指针二.使用指针数组模拟二维数组三.函数指针 一.什么是字符指针 字符指针:指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。即将字符串的首地址赋值给字符指针,可让字符指针…

【自然语言处理】:实验1布置,Word2VecTranE的实现

清华大学驭风计划 因为篇幅原因实验答案分开上传,答案链接http://t.csdnimg.cn/5cyMG 如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~ 实验1: Word2Vec&TranE的…

2024 前端面试题(GPT回答 + 示例代码 + 解释)No.21 - No.40

本文题目来源于全网收集,答案来源于 ChatGPT 和 博主(的小部分……) 格式:题目 h3 回答 text 参考大佬博客补充 text 示例代码 code 解释 quote 补充 quote 上一篇链接:2024 前端面试题(GPT回答 示例…

c语言操作符(下)

目录 ​编辑 逗号表达式 下标访问[] 函数调⽤() sizeof 结构成员访问操作符 结构体 结构体声明 直接访问 .成员名 间接访问 结构体指针->成员名 逗号表达式 exp1, exp2, exp3, …expN 运算规则:从左向右依次执⾏。整个表达式的结果是最后⼀个表达…

【AIGC】Stable Diffusion的模型微调

为什么要做模型微调 模型微调可以在现有模型的基础上,让AI懂得如何更精确生成/生成特定的风格、概念、角色、姿势、对象。Stable Diffusion 模型的微调方法通常依赖于您要微调的具体任务和数据。 下面是一个通用的微调过程的概述: 准备数据集&#xf…

基于FPGA的ECG信号滤波与心率计算verilog实现,包含testbench

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 ECG信号的特点与噪声 4.2 FPGA在ECG信号处理中的应用 4.3 ECG信号滤波原理 4.4 心率计算原理 4.5 FPGA在ECG信号处理中的优势 5.算法完整程序工程 1.算法运行效果图预览 其RTL结构如…

英语题不会怎么搜答案?分享五个支持答案和解析的工具 #学习方法#媒体

在大学的学习过程中,我们常常会遇到一些难以解决的问题,有时候甚至会感到束手无策。然而,如今的技术发展给我们提供了新的解决方案。搜题软件作为一种强大的学习工具,正在被越来越多的大学生所接受和使用。今天,我将为…

【C深度解剖】取模与取余

简介:本系列博客为C深度解剖系列内容,以某个点为中心进行相关详细拓展 适宜人群:已大体了解C语法同学 作者留言:本博客相关内容如需转载请注明出处,本人学疏才浅,难免存在些许错误,望留言指正 作…

wordpress好的网站主题

有什么好的网站主题,都分享在这里了。 蓝色风格的wordpress模板,好的wordpress网站主题,需要既好看,又好用。 https://www.zhanyes.com/qiye/6305.html 血红色的好看的wordpress主题,布局经典,设计好的&am…

Panalog 日志审计系统 sessiptbl.php 前台RCE漏洞复现

0x01 产品简介 Panalog是一款日志审计系统,方便用户统一集中监控、管理在网的海量设备。 0x02 漏洞概述 Panalog日志审计系统 sessiptbl.php接口处存在远程命令执行漏洞,攻击者可执行任意命令,接管服务器权限。 0x03 影响范围 version <= MARS r10p1Free 0x04 复现…

每日一题 力扣107 二叉树的层序遍历Ⅱ

107. 二叉树的层序遍历 II 题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20…

OLED显示红外遥控键码

基本原理 本遥控器的编码是NEC编码&#xff0c;为PWM&#xff08;脉冲宽度调制&#xff09;。 发射红外载波的时间固定&#xff0c;通过改变不发射载波的时间来改变占空比。 逻辑“0”是由0.56ms的38KHZ载波和0.560ms的无载波间隔组成&#xff1b;逻辑“1”是由0.56ms的38KHZ…

[职场] 汉语言文学求职信范文 #微信#笔记

汉语言文学求职信范文 在撰写求职信之前一定要明确自己写信的目的&#xff0c;然后&#xff0c;在撰写过程中&#xff0c;朝着这个目的前进。其次&#xff0c;撰写求职信的时候一定要包含自己的竞争优势&#xff0c;用相应的数据或者故事讲述&#xff0c;切记空谈阔论。最后&am…

如何使用python在三天内制作出一个赛车游戏

制作一个赛车游戏是一个复杂的过程&#xff0c;涉及多个方面&#xff0c;如游戏设计、图形渲染、物理引擎、用户输入处理等。在三天内完成这个任务可能非常具有挑战性&#xff0c;特别是如果你是初学者。但如果你有基本的Python编程知识和一些游戏开发经验&#xff0c;以下是一…

vivado Shift Registers、Dynamic Shift Registers

移位寄存器是一个触发器链&#xff0c;允许数据在固定&#xff08;静态&#xff09;数字上传播延迟阶段。相反&#xff0c;在动态移位寄存器中&#xff0c;传播链的长度在电路操作期间动态变化。从“coding”下载编码示例文件示例。 静态移位寄存器元件 静态移位寄存器通常包…

Vue核心基础3:计算属性和监视属性

1 计算属性 这边以姓名案例&#xff0c;来介绍计算属性 <body><div id"root"><!-- 姓&#xff1a;<input type"text" v-model:value"firstName"><br>名&#xff1a;<input type"text" v-model:value&…

AlmaLinux更换鼠标样式为Windows样式

文章目录 前言先看看条件与依赖第一步&#xff1a;测试最终效果第二步&#xff1a;使用CursorXP修改鼠标样式CurosrXP安装CursorXP使用 第三步&#xff1a;Linux端环境搭建与命令执行UbuntuFedora其他系统均失败 第四步&#xff1a;应用主题 前言 只不过是突发奇想&#xff0c…