当前位置: 首页 > news >正文

【OAuth2】授权框架的四种授权方式详解

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《OAuth 2》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

一、OAuth2的简介

1.什么OAuth2

OAuth 2 是一种授权框架,允许第三方应用通过用户授权的形式访问服务中的用户信息,最常见的场景是授权登录;再复杂一点的比如第三方应用通过 Github 给开发者提供的接口访问权限内的用户信息或仓库信息。OAuth2 广泛应用于 web 、桌面应用、移动 APP 的第三方服务提供了授权验证机制,以此实现不同应用间的数据访问权限。 下面分别从不同角色、授权类型、使用场景及流程的纬度详细介绍 OAuth2

2.OAuth Roles

OAuth 定义了四种角色

  • 资源拥有者 (Resource Owner)
  • 客户端 (Client)
  • 资源服务器 (Resource Server)
  • 授权服务器 (Authorization Server)

资源拥有者其实就是真实的用户,用户授权给第三方应用访问在其他系统的用户信息。第三方应用访问授权用户的信息范围 scope 属于申请接入服务时选择的权限之内(例如:读或写访问权限)

资源服务控制用户的信息,授权服务验证用户提供的信息是否正确并返回 access token 给第三方应用。 站在第三方开发者的角度看,被接入的系统提供的服务 API 同时实现了资源和授权角色。在这里把资源服务端和授权服务端统一为“服务角色或 API 角色”。

客户端就是要求接入的第三方应用,获取用户在提供服务的系统的账户信息。对于客户端而言,最终获取到用户在服务端的账户信息首先需要用户授权,用户授权后传给提供服务端验证成功之后返回 access token ,在通过 access token 请求提供服务的系统(在这里我们成为 API ,下文也是)获取用户在 API 中的账户信息。

3.授权流程

接下来文中提到的客户端均为第三方应用,服务端均为被接入的服务。譬如拉勾网有微博登录功能,那么拉勾网就是客户端,微博就是服务端。

刚刚解释了 OAuth 系统中角色的概念,接下来可以解释整个授权的流程。

流程图解释:

  1. 用户点击客户端提供的授权请求
  2. 客户端请求服务的授权页面呈现给用户,用户点击确认授权后服务端返回授权许可凭证给客户端
  3. 客户端通过步骤二接收到的授权许可凭证及在服务端注册的应用信息请求服务端
  4. 如果步骤三验证通过服务端则返回 access token 给客户端
  5. 客户端通过第四步获取的 access token 请求服务端获取资源
  6. 如果服务端校验 access token 成功,则返回指定资源给客户端

以上步骤是 OAuth2 授权登录的步骤,当然不同类型的授权许步骤会不一样,下文会详细逐一讨论。

二、第三方应用创建

第三方接入某平台的 OAuth 2 服务之前,通常需要在平台提供的注册网站(通常叫做 developer" or "API")新建一个应用,注册成功之后平台会生成应用的 ID 和密码。 读者可以访问 Github 的开发中心看看,国内写的规范的有 coding developer

在平台的注册页面至少得提供如下信息

  • 应用名称
  • 应用网址
  • 回调链接

回调域名的作用:用户点击同意按钮之后,服务端向客户端返回授权码或 access token ,当然如果是禁止操作也需回调告知客户端结果。

在 OAuth 2 服务提供平台新建一个应用之后,平台会提供一对客户端 ID 和密码作为客户端凭证。客户端 ID 是可以公开的字符串,用以构建授权请求链接;用户授权之后,客户端使用服务端的授权码和平台分配的密码获取 access token 。密码应当妥善保管以免泄漏。

1.授权许可

在第一张授权流程图中,前四步包含了获取授权许可获取 access token ,授权许可有四种类型,服务端返回哪种类型取决于客户端在请求链接中构建的 response_type 参数。四种类型的授权许可有不同的应用场景:

  • 授权码:通过授权码,服务端通过 Ajax 把 access token 返回给客户端
  • 隐式:用于移动 APP 或 web 应用(应用运行在用户的设备上)
  • 用户密码凭证:同一个公司不同系统之间内部账户互联互通,比如国内某社区的代码托管系统通过社区的账户也可以登录。
  • 客户端凭证:第三方应用自身服务访问提供 OAuth2 服务提供的平台资源

1.1.授权码 (Grant Type: Authorization Code)

授权码是 OAuth2 授权最广泛的方式,得益于平台给第三方应用分配的 ID 和密码都是隐藏在第三方应用的后端代码中。因为授权码是基于重定向的方式,要想使用授权码的方式,第三方应用必须能够调用用户系统中的应用(譬如浏览器)、和提供一个接口接收平台服务的回调获取授权码。

一步步解释授权码的流程图

步骤一:构建获取授权码请求链接
下文提到的例子都是基于 digiterocean 的 OAuth2

第一步是构建一个请求 Auth Server 获取授权码的链接,向服务端发起请求

https://cloud.digitalocean.com/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read

分解请求链接:

  • https://cloud.digitalocean.com/v1/oauth/authorize 表示服务端授权 endpoint
  • client_id 平台分配给第三方应用的 ID
  • redirect_uri=CALLBACK_URL 第三方开发者在平台新建第三方应用时填写的回调 URL
  • response_type=code 指定服务端返回授权码
  • scope=read 指定第三方应用请求权限类型
步骤二:用户授权给第三方应用

当用户点击第一步构建的链接之后,在用户已经登录服务端之后才能点击确认授权(譬如想通过微信登录某个第三方网址,你必须首先已经登录微博)。这是平台会给用户提供一个页面给用户确认是否授权。

步骤三:服务端给客户端返回授权码

当用户点击同意授权之后,服务端发起一个请求重定向到第三方平台填写的回调链接,且请求链接中同时包含了服务端生成的授权码。

https://dropletbook.com/callback?code=AUTHORIZATION_CODE
步骤四:第三方应用请求服务端,获取 access token

客户端获取到服务端返回的授权码之后,接着使用授权码和平台分配的密码请求服务端获取服务端的 access token 。第三方应用后端代码拼接的 URL 格式形似:

https://cloud.digitalocean.com/v1/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

在这里需注意两个参数,其一是 client_secret 没有暴露出去,在第三方应用后端代码中拼接请求链接;另一是 redirect_uri ,这里不是在平台新建应用时填写的回调链接,而是第三方应用已经实现的另一个 action 处理服务端返回 access token 的请求。

步骤五:第三方应用接收 access token

如果第四部客户端发送的信息被服务端校验成功,服务端则返回 access token ,有一些平台同时也同时传递 refresh token 。返回的 json 信息形似:

{
"access_token":"ACCESS_TOKEN",
"token_type":"bearer",
"expires_in":2592000,
"refresh_token":"REFRESH_TOKEN",
"scope":"read",
"uid":100101,
"info":{"name":"Mark E. Mark","email":"mark@thefunkybunch.com"}
}

至此,已经走完 oauth 2 授权码的方式所有流程。在 access_token 没有失效的前提下,可通过 access_token 可以访问平台服务端提供的资源。另外如果还提供了 refresh_token ,在 access_token 失效的情况下,可以通过 refresh_token 再次去获取有效的 access_token 。

1.2.隐式 (Grant Type: Implicit)

相比授权码的授权许可这种后端实现,隐式授权类型在应用于前端实现(移动客户端或者浏览器),其缺陷就是并不保证平台分配给第三方平台的密码凭证足够安全。隐式授权同样也是基于重定向的方式,但是 access_token 通过网页重定向返回给第三方平台而不是通过接口调用的方式 暴露了 access_token 在重定向链接中,这点和授权码不同。另外,也不支持服务端校验客户端第三方应用密码,只是依赖在平台新建应用是填写的回调链接。

隐式授权不支持 refresh_token

授权大概流程如下:用户请求授权,同意授权后服务端把 access_token 拼接到回调链接上通过浏览器重定向到客户端,然后客户端获取到 access_token

通过流程图可看出在第三步和授权码不同的是服务端重定向到网页而不是通过接口把 access_token 返回给客户端。

步骤一:构建隐式授权请求链接

与授权码的步骤一差不多一致,只是 response_type 字段的参数值为 token

步骤二:用户授权给第三方

与授权码授权的步骤二完全一致

步骤三:通过服务端重定向链接,User-agent (浏览器或者 APP) 获取 access_token

与授权码不同的是,用户点击授权之后服务端通过把 access_token 通过网页重定向到回调链接,客户端通过重定向链接才能获取到access_token ;而授权码获取 access_token是通过服务端通过 ajax 请求的形式直接访问第三方应用的后端接口,把 access_token传给第三方后端。

步骤三:前端根据重定向调整

前端浏览器重定向请求第三方平台的后端

步骤五:第三方应用后端通过脚本获取在重定向链接中的 access_token

第三方应用后端通过脚本获取在重定向链接上的 access_token

步骤六:User-Agent 执行第三方应用后端返回的脚本把 access_token 返回给第三方平台后端。

1.3用户密码凭证

用户直接给第三方应用提供在提供服务端账号密码,获取服务端的 access_token。这种授权方式常用于一个企业不同服务之间的账号互联互通。 用户给第三方应用提供账号密码之后,客户端发送 POST 请求给服务端获取access_token

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

如果服务端校验客户端(第三方应用)传过来的账户密码正确,则把 access_token返回给客户端,用户授权完成。

1.4.客户端凭证

这种授权方式常用于第三方应用想要更改自身在服务提供方注册的应用信息,比如更改应用描述或回调链接地址。

第三方应用通过发送服务端分配的 ID 和密码给后端校验,POST 的 URL 格式形似:

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

Access Token 和 Refresh Token

第三方应用从服务提供平台获取到有效的 access_token 之后,即可根据平台提供的接口访问服务端的资源。

curl -X POST -H "Authorization: Bearer ACCESS_TOKEN""https://api.digitalocean.com/v2/$OBJECT"

如果服务提供平台支持 refresh_token ,那么第三方应用的 access_token 失效之后,可通过 refresh_token 再次获取有效的 access_token

例如 digitalocean 支持第三方应用通过 POST 请求再此获取有效的 access_token

https://cloud.digitalocean.com/v1/oauth/token?grant_type=refresh_token&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN 

请添加图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

相关文章:

【OAuth2】授权框架的四种授权方式详解

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《OAuth 2》。🎯🎯 &#x1…...

AI数字人不间断直播是什么?数字人直播带货如何搭建?

随着电商行业的崛起,数字人直播成为了最为热门的直播方式之一。数字人直播利用AI技术创建出的数字人进行直播,给观众带来了全新的视觉体验。 一、AI数字人无限播(数字人SaaS系统VX:zhibo175)是什么? AI数字…...

真菌基因组研究高分策略(二):比较基因组揭示寄主外生菌根真菌基因组的动态进化

在表征外生菌根(ECM)真菌的“共生工具包”方面的研究已经取得了重大进展,但宿主特异性如何被编码到ECM真菌基因组中仍知之甚少。2021年发表于《New Phytologist》期刊的文章对ECM真菌宿主特异性和通用性进行了比较基因组分析,重点…...

uni-app之HelloWorld实现

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…...

CVE-2023-49898 Apache incubator-streampark 远程命令执行漏洞

项目介绍 Apache Flink 和 Apache Spark 被广泛用作下一代大数据流计算引擎。基于大量优秀经验结合最佳实践,我们将任务部署和运行时参数提取到配置文件中。这样,带有开箱即用连接器的易于使用的 RuntimeContext 将带来更轻松、更高效的任务开发体验。它…...

即将来临的2024年,汽车战场再起波澜?

我们来简要概况一下11月主流车企的销量表现: 根据数据显示,11月吉利集团总销量29.32万辆,同比增长28%。这在当月国内主流车企中综合实力凌厉,可谓表现得体。而与吉利直接竞争的比亚迪,尽管数据未公布,但我们…...

Python 爬虫之下载视频(二)

爬取某Y的视频链接和标题 文章目录 爬取某Y的视频链接和标题前言一、基本思路二、程序解析阶段三、程序处理阶段总结 前言 这篇内容就简单给大家写个如何从网页上爬取某B主 主页 页面上所有的视频链接和视频标题。 这篇是基础好好看,下篇会根据这篇的结果做一个批…...

智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子轨道搜索算法4.实验参数设定…...

[机器人-2]:开源MIT Min cheetah机械狗设计(二):机械结构设计

目录 1、四肢朝向的选择 2、电机布局形式的选择 3、电机的选型及测试(非常重要) 4、结构优化 5、尺寸效应 6、其他 1、四肢朝向的选择 机械狗的结构设计,第一个摆在我们面前的就说四肢的朝向问题,如下图,我们是…...

用友U8+CRM help2 任意文件读取漏洞复现

0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件,旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 help2接口处存在任意文件读取漏洞,攻击者通过漏洞可以获取到服…...

freeRTOS实时操作系统学习笔记

温馨提示:点击图片查看大图更清晰 —————————————————————————————↑↑↑上方资源下载后可获取xmind原文件。 1、freeRTOS移植和配置脑图 2、内核源码学习...

解决虚拟机卡顿、卡死、待机后不动的情况(真实有效

本人环境: VM workstation 17.5 ubuntu 22.04 虚拟机配置:4核 4g issue: 出现开机卡死不动运行一段时间,可能半小时不到,就页面卡死不动经常需要关机重启才解决,可能没有解决 1.配置虚拟化引擎 这一步我称…...

【MybatisPlus快速入门】(3)SpringBoot整合MybatisPlus 之 Lombok插件安装及MybatisPlus分页代码示例

目录 1.Lombok1.1 步骤1:添加lombok依赖 2.2 步骤2:安装Lombok的插件1.3 步骤3:模型类上添加注解2 分页功能2.1 步骤1:调用方法传入参数获取返回值2.2步骤2:设置分页拦截器2.3 步骤3:运行测试程序 之前我们已学习MyBatisPlus在代码示例与MyBatisPlus的简介,在这一节…...

SpaceDesk如何连接平板/PC(生产力副屏)

1、下载安装 分为安卓端和PC端,两个设备都需要安装对应的软件。 SpaceDesk官网 https://link.zhihu.com/?targethttp%3A//spacedesk.net/ 需要魔法上网。安装过程比较简单,无脑下一步即可。 我已经把安装包准备好了,如果不想自己找&#…...

61.SVN版本控制系统

SVN(Subversion)是一种集中式版本控制系统,它有一个中央仓库用于存储代码库的完整历史记录。相对于分布式版本控制系统(例如 Git),SVN 不支持本地仓库。 一、SVN 安装。 (1)在windo…...

操作系统 内存管理篇

一.程序的装入和链接 装入方式: 链接方式: 二.进程的内存映像 三.内存的分配 1.连续分配 分配方式: 2.不连续分配 分页:页面大小一致 引入快表(和 cache 处理思路一致) 升级到二级页表 分段:…...

深度学习中用来训练的train.py 探究学习2.0( 数据预处理)

数据预处理 下列代码为train.py中常见的一些数据处理方法 train_transform transforms.Compose([transforms.Resize((224, 224)),transforms.RandomVerticalFlip(),# 随机旋转,-45度到45度之间随机选transforms.RandomRotation(45),# 从中心开始裁剪transforms.C…...

vscode debug c++代码

需要提前写好CMakeLists.txt 在tasks.json中写好编译的步骤,即tasks,如cmake … 和make -j 在lauch.json中配置可执行文件的路径和需要执行tasks中的哪一个任务 具体步骤: 1.写好c代码和CMakeLists.txt 2.配置tasks.json 终端–>配置任务…...

HarmonyOS的功能及场景应用

一、基本介绍 鸿蒙HarmonyOS主要应用的设备包括智慧屏、平板、手表、智能音箱、IoT设备等。具体来说,鸿蒙系统是一款面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统,能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备…...

汽车级EEPROM 存储器 M24C64-DRMN3TP/K是电可擦除可编程只读存储器?它的功能特性有哪些?

M24C64-DRMN3TP/K是一款64 Kbit串行EEPROM汽车级设备,工作温度高达125C。符合汽车标准AEC-Q100 1级规定的极高可靠性。 该设备可通过一个高达1MHz的简单串行I2C兼容接口访问。 存储器阵列基于先进的真EEPROM技术(电可擦除可编程存储器)。M2…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...