OAuth2.0 四种授权方式讲解

一、OAuth2.0 的理解

        OAuth2是一个开放的授权标准,允许第三方应用程序以安全可控的方式访问受保护的资源,而无需用户将用户名和密码信息与第三方应用程序共享。OAuth2被广泛应用于现代Web和移动应用程序开发中,可以简化应用程序与资源服务器之间的授权过程,提高应用程序的安全性。

OAuth2的基本工作原理如下:

案例解读:

用户授权第三方应用程序访问其社交媒体账户

  1. 用户在第三方应用程序中点击“登录”或“授权”按钮。
  2. 第三方应用程序将用户重定向到社交媒体平台的授权页面。
  3. 用户在授权页面上输入其社交媒体账户的用户名和密码(或扫码),并点击“授权”。
  4. 社交媒体平台会向用户展示授权详细信息,如应用程序名称、权限范围等,并要求用户确认授权。
  5. 用户点击“确认授权”后,社交媒体平台会向第三方应用程序颁发一个访问令牌(Access Token)。
  6. 第三方应用程序将访问令牌存储起来,并使用该访问令牌来访问社交媒体平台上的受保护资源,如用户个人信息、社交分享、好友列表等。

        在这个案例中,第三方应用程序是OAuth2的客户端应用程序,社交媒体平台是OAuth2的资源服务器,用户是OAuth2的资源所有者。OAuth2服务器是社交媒体平台提供的服务,负责颁发访问令牌。

OAuth2的工作流程可以总结为以下几个步骤:

  1. 客户端应用程序请求用户授权。
  2. 用户授权后,客户端应用程序向OAuth2服务器请求访问令牌。
  3. OAuth2服务器颁发访问令牌给客户端应用程序。
  4. 客户端应用程序使用访问令牌访问资源服务器上的受保护资源。

        OAuth2通过将用户密码信息与第三方应用程序隔离,提高了应用程序的安全性。同时,OAuth2是一个开放的标准,可以与不同的应用程序、平台和设备兼容,易于理解和使用,可以快速集成到应用程序中。

二、OAuth2.0 授权方式 

OAuth2.0 的授权简单理解其实就是获取令牌(token)的过程,OAuth 协议定义了四种获得令牌的授权方式(authorization grant )如下:

  • 授权码(authorization-code
  • 隐藏式(implicit
  • 密码式(password):
  • 客户端凭证(client credentials

        但值得注意的是,不管我们使用哪一种授权方式,在三方应用申请令牌之前,都必须在系统中去申请身份唯一标识:客户端 ID(client ID)和 客户端密钥(client secret)。这样做可以保证 token 不被恶意使用。授权码模式和密码模式比较常用。

2.1 授权码模式

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

OAuth2.0四种授权中授权码方式是最为复杂,但也是安全系数最高的,比较常用的一种方式。这种方式适用于兼具前后端的Web项目,因为有些项目只有后端或只有前端,并不适用授权码模式。

利用qq登录扫码授权示例:

请求示例:

(A)步骤:客户端申请认证的URI

https://graph.qq.com/oauth2.0/show?which=Login

&display=pc

&scope=get_idollist%2Cget_fans……

&response_type=code

&redirect_uri=https%3A%2F%2Fpassport.iqiyi.com%2……

&client_id=xxxx

&state=ZOvw70n5zJtY1H%2……

参数说明:

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

(B)步骤:用户·确认授权

(C)步骤:服务器回应客户端的URI

https://graph.qq.com//client.example.com/cb?code=SplxlOBeZQQ&state=xxx

参数说明:

参数类型说明
code授权码,必选项。授权码有效期通常设为10分钟,一次性使用。该码与客户端ID、重定向URI以及用户,是一一对应关系。
state原样返回客户端传的该参数的值

(D)步骤:客户端向认证服务器申请令牌

https://graph.qq.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权限范围,如果与客户端申请的范围一致,此项可省略

2.2 密码模式

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

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

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

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

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

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

2.3 客户端模式 

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

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

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

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

一些具体的客户端凭证模式的使用场景包括:

  • 物联网设备: 物联网设备通常需要连接到云平台来发送数据和接收指令。可以使用客户端凭证模式来获取访问令牌,而不需要用户登录。
  • 智能家居设备: 智能家居设备通常需要连接到云平台来接收指令和控制其他智能家居设备。可以使用客户端凭证模式来获取访问令牌,而不需要用户登录。
  • 可穿戴设备: 可穿戴设备通常需要连接到云平台来同步数据和接收指令。可以使用客户端凭证模式来获取访问令牌,而不需要用户登录。
  • 后台数据处理任务: 后台数据处理任务通常需要访问某个API来获取数据或处理数据。可以使用客户端凭证模式来获取访问令牌,而不需要用户登录。
  • 服务集成: 两个服务之间需要集成,可以使用客户端凭证模式来获取访问令牌,而不需要用户登录。

2.4 隐藏

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

https://graph.qq.com/oauth2.0/authorize?
  response_type=token&
  client_id=CLIENT_ID&
  redirect_uri=http://juejin.im/callback&
  scope=read

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

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

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

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

相关文章

顺序表的基本操作(必学)

目录 线性表: 顺序表: 概念和结构: 动态顺序表常用操作实现: 头文件(数组顺序表的声明): 各种基本操作总的声明: 顺序表的初始化: 顺序表的销毁 顺序表的打印 …

录屏软件哪个好用?全方位测评告诉你

随着数字技术的不断发展,录制屏幕的需求也越来越大。无论是制作教程、记录游戏过程,还是保存会议内容,一款好用的录屏软件都能让用户事半功倍。可是录屏软件哪个好用呢?在本文中,我们将介绍三款流行的录屏软件。通过详…

std::string在 Windows MSVC和Linux Gcc 中capacity容量扩容策略的分析和对比

1、capacity()作用 在std::string中,capacity()为当前string占用内存字符的长度,表示当前string的容量,可以理解为一个预分配制度,如果当前的string不断进行扩展操作,则不需要每次都进行内存上的分配,提高程…

iconify图标集离线使用方案简介

1.需求描述 前端项目,技术栈使用Vue3Element Plus,参考了ruoyi-vue-pro项目与vue-element-plus-admin项目,封装了一个Icon组件,图标使用的是iconify,项目部署在内网环境,不能连接互联网,需要部署一套iconi…

MAC鼠标中键的使用

MAC鼠标没有鼠标中键,于是在一些场景中用起来非常麻烦,这里介绍几种键盘快捷键鼠标左键实现中键功能的例子: 1)在sublime text 或者pycharm等一些文本编辑器或IDE中实现中键修改一列数据中特定位置的值 FNOPT左键另外还有C4D&…

生存分析序章1——解析生存分析:探寻时间与事件的奥秘

写在开头 生存分析,作为统计学和生物学交汇的领域,旨在探究时间与事件之间的奥秘。这一领域的深入研究不仅在医学和生物学领域有着广泛的应用,同时在数据分析和数据挖掘中也发挥着关键作用。 1 基本概念 1.1 什么是生存分析 生存分析&…

STM32独立看门狗和窗口看门狗的区别

独立看门狗: 本质上是一个定时器,这个定时器有一个输出端,可以输出复位信号。 该定时器是一个 12 位的递减计数器,当计数器的值减到 0 的时候,就会产生一个复位信号。如果在计数没减到 0 之前,重置计数器的…

如何使用 NestJS 集成 Passort 和 JWT Token 实现 HTTP 接口的权限管理

💡 如果你不希望其他人可以随意进出你的房子,那么你需要给你的房子上个锁。 前言 开发一个接口很容易,开发一个具有安全性的接口却不容易。成熟的后端服务项目最注重的一点就是如何保护系统的数据安全,不能让用户无脑的访问操作所…

大数据Doris(四十一):物化视图简单介绍

文章目录 物化视图简单介绍 一、适用场景

利用html2Canvas将表格下载为html

给到我的需求是点击按钮时请求后端接口,根据后端返回的数据,生成表格,并将表格的内容直接下载为html,如下图。 平常做的下载都是后端返回二进制流,这次前端做下载那就必须把页面先画出来,因为下载下来的表格在页面上是不显示的&a…

Keepalived 高可用详解

Keepalived 详解 1、Keepalived介绍 ​ Keepalived是一个基于VRRP协议来实现LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会使用2台服务器运行Keepalived,一台为主服务器MASTER,另一台为备份服务器BACKUP,但是对外表…

12月25日作业

串口发送控制命令&#xff0c;实现一些外设LED 风扇 uart4.c #include "uart4.h"void uart4_config() {//1.使能GPIOB\GPIOG\UART4外设时钟RCC->MP_AHB4ENSETR | (0x1 << 1);RCC->MP_AHB4ENSETR | (0x1 << 6);RCC->MP_APB1ENSETR | (0x1 <…

深入剖析LinkedList:揭秘底层原理

文章目录 一、 概述LinkedList1.1 LinkedList简介1.2 LinkedList的优点和缺点 二、 LinkedList数据结构分析2.1 Node节点结构体解析2.2 LinkedList实现了双向链表的原因2.3 LinkedList如何实现了链表的基本操作&#xff08;增删改查&#xff09;2.4 LinkedList的遍历方式 三、 …

静态HTTP的未来:探讨新技术趋势

在Web的世界里&#xff0c;静态HTTP一直是个不可或缺的角色。它就像一个尽职尽责的邮递员&#xff0c;确保数据安全、准确地送达目的地。但随着时代的发展&#xff0c;邮递员也需要跟上潮流&#xff0c;不断学习和进步。那么&#xff0c;静态HTTP的未来会是怎样的呢&#xff1f…

CMMI-项目总体计划模版

目录 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章 运维计划 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章运维计划

从流星雨启程:Python和Pygame下载与安装全过程

文章目录 一、前言二、下载安装过程1.官网下载安装包2.安装python过程第一步第二步第三步第四步第五步安装完成 3.简单测试Python3.1 检查 Python 版本号3.2 打开 Python 解释器3.3 输入你的第一个代码3.4 运行 Python 脚本 4.安装Pygame4.1 cmd命令安装Pygame4.2 pip升级4.3 安…

C++的面向对象学习(6):运算符的重载

文章目录 前言&#xff1a;什么是运算符重载&#xff1f;针对自定义的类与对象类型。一、加号的运算符重载1.引入背景2.所以运算符重载的作用&#xff1a;3.实现对象间的相加代码&#xff1a;号运算符重载①在类中实现加号运算符重载②设计全局函数实现加号运算符重载③改写函数…

基于QListWidget的多段曲线展示器

目录 1 开发背景 2 创建程序 3 更改main window函数 4 测试构造函数 5 文件打开函数 6 拖放的实现 1 开发背景 由于视图控件的拖放逻辑比较难&#xff0c;需要同时子类化视图和模型&#xff0c;那么对于小数据而言&#xff0c;不如使用便捷类。因此&#xff0c;决定对多…

JavaOOP篇----第十八篇

系列文章目录 文章目录 系列文章目录前言一、什么是成员内部类二、Static Nested Class 和 Inner Class的不同三、什么时候用assert四、Java有没有goto前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女…

探索音乐创作的新境界——PreSonus Studio One Pro 6

音乐是人类情感的表达方式之一&#xff0c;而音乐制作编曲软件则是让人们将创意转化为音乐作品的重要工具之一。在众多软件中&#xff0c;PreSonus Studio One Pro 6凭借其强大的功能和出色的用户体验&#xff0c;成为了许多音乐制作人的首选。 首先&#xff0c;PreSonus Stud…