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

news2024/11/29 10:50:49

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 第三方登录

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

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

相关文章

Kubernetes安装部署 2

Kubeadm创建集群 如上所示,在阿里云的香港地域的ECS服务器上拉取下载Kubernetes官方提供的容器镜像 如上所示,在阿里云的香港地域的ECS服务器保存镜像到本地 Node A服务器的IP地址:192.168.0.130 端口号6443开放、部署Docker容器引擎、支持cr…

Lua: 一门轻量级、高效的脚本语言

Lua: 一门轻量级、高效的脚本语言 在当今软件开发的领域中,寻找一门既灵活又高效的脚本语言,一直是开发者们追求的目标。Lua作为一门小巧、高效、可嵌入的脚本语言,已经成为了众多开发者的首选之一。无论是游戏开发、嵌入式系统、Web 开发还是…

linux安装mysql8且初始化表名忽略大小写

mysql8下载地址 MySQL8.0安装步骤 1、把安装包上传到linux系统,解压、重命名并移动到/usr/local/目录: cd ~ tar -xvf mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz mv mysql-8.0.32-linux-glibc2.12-x86_64/ mysql80/ mv mysql80/ /usr/local/2、在M…

Linux 基础/子目录分配/文件路径

在Linux系统中,整个系统只具有一个根目录“/”,用斜杠表示。根目录是整个文件系统的顶层目录,在他下面可以创建其他的目录和文件。 Linux中的子目录分配: /bin - 基本命令的二进制文件,这些命令可供所有用户使用&am…

互联网加竞赛 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

嵌入式中数字音频信号传输协议:I2S协议实现

介绍 I2S(Inter—IC Sound)总线, 又称集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。 采用沿独立的导线传输时钟与数据信号的设计,通过分离数据和时钟信号,避免了时差诱发的失真。 支持全双工/半…

事务及在SpringBoot项目中使用的两种方式

1.事务简介 事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。 事物的四大特性: 原子性(Atomicity)&#xf…

编程和计算机基础

编程 编程:就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。 计算机程序:是计算机所执行的一系列的指令集合,而程序全部都是用我们所掌握的语言来编写的,所以人们控制计算机一…

Java实现课程案例资源库系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员需求分析2.2 用户需求分析 三、系统设计3.1 业务流程设计3.1.1 管理员业务流程设计3.1.2 用户业务流程设计3.1.3 首页功能模块及业务流程分析3.1.4 案例资源中心功能模块及业务流程分析3.1.5 用户信息中心功能模块…

2024龙年特别篇 -- 魔法指针 之 指针变量的意义 指针运算

学习完指针变量:链接后, 我们继续学习指针变量的应用 目录 程序展示 原始方式 指针变量方式 代码对比 指针运算 指针-整数 用指针打印数组内容 使用指针打印1-10中的奇数 指针-指针 指针的关系运算 程序展示 打印一个有10个元素的数组&am…

删除 Windows 设备和驱动器中的 WPS网盘、百度网盘等快捷图标

在安装诸如WPS软件、百度云盘、爱奇艺等客户端后,Windows 的“我的电脑”(或“此电脑”)中的“设备和驱动器”部分会出现对应的软件图标。这种情况被许多技术人员视为不必要的干扰,因此许多用户想要知道如何隐藏或删除这些图标。 …

面试技术栈 —— 2024网易雷火暑期实习真题

面试技术栈 —— 2024网易雷火暑期实习真题 1. 最长递增子序列。2. 集中限流和单机限流你觉得哪个好?3. redis部署服务器配置,为什么不用哨兵?4. 讲讲分布式session的原理。5. 数据库:表数据量大了,如何分表&#xff1…

基于四叉树的图像分割算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ........................................................... Imgs(dx 1 : dx R1, dy 1 …

Linux学习(三)shell编程

1.echo指令 用于将后面的字体内容回显到控制台,将后面的字体用单引号或双引号引起来都会忽略引号 2.expr数学运算 3.第一个shell脚本 一般shell脚本以.sh为后缀,通过sh命令来执行shell脚本。 4.shell脚本的命令行参数 $1 $2 $3 $4 $5 $6 $7 $8 $9 $0 &…

TeamCity创建git项目Timed out 超时的一个解决办法

问题: 当自己: ping github.com从本地推送到远程仓库浏览器浏览www.github.com ——都没有问题 但是在teamcity创建工程的时候就超时: 或者多试几次,终于成功了,然后构建的时候半途超时报错。。。。。 一种解决办…

用HTML5 Canvas创造视觉盛宴——动态彩色线条效果

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- 声明文档类型为XHTML 1.0 Transitional -…

【Linux 04】编辑器 vim 详细介绍

文章目录 &#x1f308; Ⅰ 基本概念&#x1f308; Ⅱ 基本操作1. 进入 / 退出 vim2. vim 模式切换 &#x1f308; 命令模式1. 光标的移动2. 复制与粘贴3. 剪切与删除4. 撤销与恢复 &#x1f308; Ⅲ 底行模式&#x1f308; Ⅳ 异常退出 &#x1f308; Ⅰ 基本概念 vim 是一种…

ArduPilot开源飞控之硬件SBC分析

ArduPilot开源飞控之硬件SBC分析 1. 源由2. Companion Computer2.1 APSync【不推荐&#xff0c;无更新】2.2 DroneKit【不推荐&#xff0c;无更新/SDK】2.3 FlytOS【不推荐&#xff0c;闭源】2.4 Maverick【不推荐&#xff0c;闭源】2.5 ROS【专门讨论&#xff0c;开源/复杂】2…

【STM32 CubeMX】串口编程DMA

文章目录 前言一、DMA方式1.1 DMA是什么1.2 CubeMX配置DMA1.3 DMA方式函数使用DMA的发送接收函数 总结 前言 在嵌入式系统中&#xff0c;串口通信是一项至关重要的功能&#xff0c;它允许单片机与外部设备进行数据交换&#xff0c;如传感器、显示器或其他设备。然而&#xff0…

基于GPT-4一键完成数据分析全流程的AI Agent: Streamline Analyst

大型语言模型&#xff08;LLM&#xff09;的兴起不仅为获取知识和解决问题开辟了新的可能性&#xff0c;而且催生了一些新型智能系统&#xff0c;例如旨在辅助用户完成特定任务的AI Copilot以及旨在自动化和自主执行复杂任务的AI Agent&#xff0c;使得编程、创作等任务变得高效…