OAuth2.0-授权码模式

news2024/11/18 18:35:44

解决问题

OAuth2.0授权码模式主要解决了信任问题:一个第三方网站需要访问我们Github上的数据(例如用户头像),那Github为什么要信任该网站?该对网站信任到什么程度?

  • 如果彻底信任该网站,那么将Github的用户名和密码直接交给该网站,由该网站直接登录即可。但这样使得该网站登录等同于用户登录,该网站将拥有与用户相同的权限,Github无法做权限的区分。
  • 如果不再授权给该网站,则需要更改Github密码,这样也会影响到其他被授权的网站。

基于此,如果可以为该网站提供一个专门的access_token,该access_token有专门的权限和过期时间,且Github可随时清除access_token的授权,这样问题就可以解决了。
为了提供这样一个access_token,使用如下思路:

  1. 向Github登记一下该第三方网站,Github会给出一个凭据。记下该凭据。
  2. 第三方网站提供了Github授权按钮,通常是在登录页面提供。
  3. 用户点击授权按钮来同意Github授权,则携带凭据跳转到Github的管理页面,此时需登录。若已经登录则执行步骤4。
  4. 登录Github后,验证凭据,同意授权,则生成一个access_token返回。
  5. 第三方网站保存该access_token并向Github请求数据。
  6. Github返回数据,第三方网站使用这些数据匹配已有账号,匹配成功则登录;否则创建新账号并关联,然后登录。

流程

以Github授权给第三方网站为例,OAuth2.0的授权码模式流程如下:
在这里插入图片描述
这里将第三方网站的Web端和服务端分开,而非合并在一起。Github也是。这样更容易理解整个流程的细节及设计原因。
要使用授权码访问到服务器上的资源,有三个阶段:

  1. 登记应用。
  2. 获取access_token
  3. 资源访问。

登记应用

假设我们是第三方网站的开发者,我们开发的网站要访问Github上的数据(例如用户头像),那Github为什么要信任我们的网站呢?
于是就需要进行应用的登记:我们明确地告知Github我们的应用的必要属性,Github登记后,就认可我们的网站了。
登记的流程为:
登录我们的Github账号,在其管理中找到Developer settings进入,在OAuth Apps下点击New OAuth App来创建一个新的应用。
新建应用时,需填入如下的属性:

  • Application name: 应用名。
  • Homepage URL:应用的首页地址。
  • Application description: 应用描述。
  • Authorization callback URL: 授权回调地址。默认地址。若授权请求中没有附带redirect_uri参数,则使用该地址。

点击Register application即可注册成功,Github会为该应用生成唯一的client_idclient_secret属性,这就是申请access_token的凭据。
然后第三方网站需要将client_idclient_secret保存下来,通常是作为整个网站的全局配置。该网站所有的用户都将共享这2个属性。

获取access_token

流程

第三方网站的Web端登录页需要提供一个使用Github账号登录的按钮。点击该按钮,Web端向自己的服务端索要client_idstate,拿到后Web端拼接出Github的授权页面地址,直接以外链形式打开该授权页面。
这个外链地址虽然是Github的,但需要写在我们的第三方网站前端页面中,以作为外链来跳转。同时还需要在外连上直接以明文形式附加参数,主要包含:

  • response_type: 模式类型。必须。授权码模式固定为code
  • client_id: 应用的id。必须。在Github登记后由Github生成,用于Github识别应用。
  • redirect_uri: 重定向地址。可选。无论是否同意授权,Github都要调用该外链地址来跳转回第三方网站。如果不附带该参数,则Github会使用在注册应用时提交的Authorization callback URL
  • scope: 权限。可选。用于说明请求资源的范围,即Github允许第三方网站访问哪些资源。通常scope参数依赖于授权方的定义,这里是依赖Github的定义。
  • state: 校验码。可选。当Github调用重定向地址时会再次传回该参数,用于第三方网站对请求进行合法校验,从而防止CSRF攻击。因此第三方网站需要将state保存在本地,以用于后续的校验。

外链到Github的页面打开后,访问的就已经是Github的Web端了,若Github没有登录则会提示登录Github账号。登录后,需要在页面上点击[确认授权]按钮。
点击后,Github的Web端向Github的服务端发确认授权请求,服务端生成授权码code返回给Web端。然后Web端会将code和跳转页面时传入的state拼接到redirect_uri后,以https的外链形式在浏览器中进行跳转,这样浏览器页面就又跳转回第三方网站(跳回第三方网站是在回传code时)。
浏览器页面跳转后,第三方网站的Web端将codestate发给自己的服务端,服务端对state进行校验,确认是自己发出的。
然后第三方网站的服务端向Github的服务端发送申请access_token的请求。参数主要包含:

  • client_id: 应用的id。必须。登记时Github生成。
  • client_secret: 应用的秘钥。必须。登记时Github生成。
  • grant_type: 授权方式。必须。当前为授权码方式,传入code
  • code: 上一步Github发来的授权码。必须。
  • redirect_uri: 必须。用于校验与请求code时传入的redirect_uri是否一致,不是用来做页面重定向的

Github校验client_id+client_secretredirect_uri+code无误后,生成access_token,直接放入请求的Response中返回给第三方网站的服务端。为了处理access_token过期问题,通常还会一起返回一个refresh_token
第三方网站的服务端收到返回,取出access_token后,即可调用Github的接口来获取用户相关的信息。获取到信息后,首先判断是否已存在关联账户,若存在则直接登录;否则使用这些信息来创建新用户,然后登录。
由于授权码code是跟Github的具体用户相关的,因此生成的access_token也是跟用户相关的,多个用户的access_token不同。

为什么要借助授权码code来获取access_token

第三方网站发出第一次请求时获取到了一个授权码code,使用授权码code再次获取access_token,然后才使用access_token来获取用户信息。为何要加入一个授权码code,而不是直接第一次请求就返回access_token呢?
从上述流程分析,可知:

  • 第一次请求时需要用户点击Github的[确认授权]按钮,因此页面必须跳转到Github网站的Web页面。由于需要用户点击操作,就无法将结果直接放在Response中返回,因为用户可以等一会再点授权按钮,这个等待时间可长可短,放在Response中很可能用户还没点按钮就请求超时了。
  • 跳转到了Github的Web页面,授权后必须再跳回第三方网站的Web页面,这样就需要从Github的Web页面构造一个第三方网站的Web页地址以外链形式打开,同时将授权结果拼接到URL参数中,这意味着授权结果是暴露在公网上的。若直接返回access_token拼接在URL中显然会造成安全问题。
  • 生成access_token需要校验client_secret,但client_secret是个需要保密的值,直接以外链形式传输该属性会直接暴露在公网上,同样有安全问题。

综上,先通过client_id获取一个跟Github的具体用户相关的授权码code,然后由第三方网站的服务端使用client_id+client_secretredirect_uri+code这4个属性来请求Github获取access_token。由于获取的请求交给了服务端,也就不用再担心client_secretaccess_token暴露的问题。
某些网站为了更加安全,对code设置了有效期,例如5分钟内有效,且只能使用一次。
实际上,OAuth2.0的简化模式就是取消掉了code这一步,直接在第一次请求时的重定向地址中附加access_token 由于存在暴露风险,因此往往只用于安全性不高的场景,且另外有效期非常短。通常也不会发放refresh_token

资源访问

授权码模式用于Github授权账号登录到第三方网站。因此第三方网站拿到Github账号的信息后使用这些信息来创建新用户即完成了对Github必要的资源访问,只需要访问一次,不需要重复访问。
当然,第三方网站可以对access_token与新创建的账号进行绑定存储,并使用refresh_token进行有效期刷新,从而也可以重复地对Github进行资源访问。
但一般来说,这些访问请求都是由第三方网站的后端负责,第三方网站的前端是不接触access_token的。

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

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

相关文章

LeetCode链表相关解法

LeetCode链表相关解法1.移除链表元素[203. 移除链表元素](https://leetcode.cn/problems/remove-linked-list-elements/)不设置头节点设置虚拟头节点2.设计链表[707. 设计链表](https://leetcode.cn/problems/design-linked-list/)3.反转链表[206. 反转链表](https://leetcode.…

使用Java8改造模板方法模式

目录 前言 以前的模板方法 Java 8 的函数式编程 Java 8以后的模板方法 总结 前言 我们在日常开发中,经常会遇到类似的场景:当要做一件事儿的时候,这件事儿的步骤是固定好的,但是每一个步骤的具体实现方式是不一定的。 通…

Hudi(14):Hudi集成Flink之核心参数设置

目录 0. 相关文章链接 1. 去重参数 2. 并发参数 2.1. 参数说明 2.2. 案例演示 3. 压缩参数 3.1. 参数说明 3.2. 案例演示 4. 文件大小 4.1. 参数说明 4.2. 案例演示 5. Hadoop 参数 Flink可配参数官网地址:All Configurations | Apache Hudi 0. 相关文…

Ubuntu 18.04 安装 nvidia 显卡驱动 离线安装 禁用 nouveau

Ubuntu 18.04 安装 nvidia 显卡驱动 离线安装1 系统2 查看显卡2.1 更新 pci.ids 文件3 安装显卡驱动 510.543.1 安装 nvtop4 禁用 nouveau5 安装 cuda 11.6.15.1 设置环境变量1 系统 # lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubu…

bpflock:基于eBPF实现的Linux设备安全审计工具

关于bpflock bpflock是一款基于 eBPF驱动的Linux设备安全审计工具,该工具使用了eBPF来帮助广大研究人员增强Linux设备的安全性。通过限制对各种Linux功能的访问,bpflock能够减少攻击面并阻止一些众所周知的攻击技术。 bpflock只允许类似容器管理器、sy…

区间一维dp史上最细总结(听了绝对会了,还不会的一定要进来)

目录 那年初夏(三) 引入 1.动态规划是什么? 2.什么是区间动态规划问题? 定义 性质 3.为何总是要问这种问题? 区间动态规划基本 思考 步骤(划重点) 例题精讲 1.最长上升子序列 题目描…

8个 数据库性能优化方案,你知道几个?(建议收藏)

毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问题。如果我们有一套成熟的方法论,能让大家快速、准确的去选择出合适的优化方案,我相信…

IB数学AA/AI应该如何选择?

IB数学怎么选课?AA,AI,SL,HL适合哪些学生?如何学习?IB数学:AA与AI,到底应该怎么选?IB数学AA有多难?要不要学数学AA HL?适合学生 IB数学AA AA HL偏…

【SpringCloud复习巩固】Feign

目录 一.HTTP客户端Feign 1.1RestTemplate方式调用存在的问题 1.2Feign的介绍 1.3Feign的使用 1.4自定义Feign的配置 1.4.1配置Feign日志的两种方式 1.5Feign性能优化 1.5.1Feign的性能优化-连接池配置 1.6Feign的最佳实践 一.HTTP客户端Feign 1.1RestTemplate方式调用…

自学软件测试,现在年薪30w,我骄傲了吗?

从小老一辈的人就经常说,小时候不好好读书,长大了只能去工地搬砖。我是从小都不爱读书的人,但在上学时期我一直有一种优越感,认为自己读书很有天赋,读书就是比别人厉害,但事实证明也确实如此,高…

[Android Studio]Android Studio Logcat日志样式设置

🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 📋笔记目…

c++IO流!!!开工了!!!

1.什么是IO流 流是若干个字节组成的字节序列,简单来说指的是就是数据从一端到另一端 键盘到程序——>标准输入流程序到屏幕——>标准输出流程序到文件——>文件流 流类体系:一些体系管理输入和输出的流的操作 输入流输出流文件流 ios类 istream…

【DockerCE】使用docker配置和运行HertzBeat

HertzBeat是一款免Agent的监控平台,拥有强大自定义监控能力,可以对应用服务、中间件、数据库、操作系统、云原生等进行监控,配置监控告警阈值,以及告警通知(邮件、微信、钉钉、飞书)。关于这个软件的介绍,我这里就不做…

困扰多年的Docker和iptables的恩怨,今天解决了

先介绍下我的使用环境: 操作系统:CentOS7.9 Docker版本:20.10.21 事情是这样的,安装完Docker的时候,容器镜像都跑起来了,端口也放行了,就是无法控制系统防火墙friewalld,查看firewalld状态报错 …

【微信小游戏开发笔记】第一节:微信小游戏Cocos开发环境配置

微信小游戏开发环境配置 微信小游戏开发前,首先要做一些准备: 注册 微信公众平台 账号,获取小游戏AppID(小程序ID)。安装 微信开发者工具,用于编译小游戏。安装 Visual Studio Code,用于编写游戏逻辑代码。安装并配置…

Linux命令:wget(下载文件)、ssh(登录及免密登录)、scp(远程文件传输)、sh(脚本)

wget 概述 wget是一个下载文件的工具,用在命令行下,下载一些软件或从远程服务器恢复备份到本地服务器 wget支持HTTP,HTTPS和FTP协议,可以使用HTTP代理 支持自动下载 wget可以在用户退出系统的之后在后台执行。意味着你可以登…

C语言选择排序和快速排序(图解过程)+思路清晰

选择排序和快排选择排序时间复杂度和空间复杂度快排(三种方式)1.hoar时间复杂度和空间复杂度优化--三数取中优化--小区间优化2.挖坑法3.双指针(推荐)选择排序 本篇文章的重点在快排。因为选择排序无论是在思想上面还是&#xff0…

提供数百万岗位和丰厚利润,苹果却转移产业链,中国制造怎么办?

新年刚过,就传出消息指苹果直接代中国供应链企业向印度提出建厂申请,其中有14家获得了许可,而3家被否决,这凸显出苹果坚定向印度转移生产线,如此做对中国制造将产生深远影响。一、苹果对中国制造的影响巨大苹果为中国提…

新的一年,这份高级测试人的职业素养请收好~

软件测试工程师需要的专业技能计算机领域的专业技能是测试工程师应该必备的一项素质,是做好测试工作的前提条件。尽管没有任何IT背景的人也可以从事测试工作,但是一名要想获得更大发展空间或者持久竞争力的测试工程师,则计算机专业技能是必不…

5G R16+C-V2X赋能下一代智能T-Box,助力智能驾驶时代加速到来

█ 5G技术助力C-V2X持续进化,智能网联新生态逐步建立 汽车行业正面临百年未有之变局,智能汽车已经成为全球汽车产业发展的战略方向。发改委、工信部、交通部等11部委联合印发的《智能汽车创新发展战略》中指出:汽车产业与相关产业全面融合&a…