OAuth2.0 最简向导

本文是一篇关于OAuth2.0的启蒙教程,图文并茂,通俗易懂,力求用最简洁明了的方式向初学者解释OAuth2.0是什么。本文并不是冗杂难懂的长篇大论,一图胜千言,深入浅出OAuth2.0,知其然知其所以然。

参考文献

首先,需要有用户数据:

在这里插入图片描述

然后有个负责存储管理用户数据的资源服务器:

在这里插入图片描述

有个能够访问用户数据的客户端应用:

在这里插入图片描述

接着资源服务器会暴露出API接口,供客户端应用进行调用:
在这里插入图片描述

然后客户端应用可以通过这个API接口去访问用户数据:

在这里插入图片描述

最后资源服务器将用户数据返回给客户端应用:

在这里插入图片描述

如果来了个恶意客户应用怎么办:
在这里插入图片描述

即使恶意客户应用要求访问用户数据:
在这里插入图片描述

资源服务器还是返回用户数据:

在这里插入图片描述

因此需要一种机制来保护用户数据:

在这里插入图片描述

业界实践是提前给客户应用颁发一个Access Token, 它表示客户应用被授权可以访问用户数据:

在这里插入图片描述

访问用户数据时,给出Access Token:

在这里插入图片描述

资源服务器取出请求中的Access Token:

在这里插入图片描述

并校验Access Token确认客户应用有访问 用户数据的权限:

在这里插入图片描述

校验通过后,资源服务器返回用户数据:

在这里插入图片描述

该机制可以工作的前提是 必须提前给客户应用颁发Access Token:

在这里插入图片描述

那么就需要颁发Access Token的角色:

在这里插入图片描述

那么到底是谁来颁发Access Token呢?

在这里插入图片描述

授权服务器和客户应用的关系如下:

在这里插入图片描述

授权服务器负责生成Access Token:

在这里插入图片描述

并给客户应用颁发Access Token:

在这里插入图片描述

角色回顾:一个授权服务器,一个客户应用,一个资源服务器:

在这里插入图片描述

授权服务器负责生成Access Token:

在这里插入图片描述

并将Access Token颁发给客户应用:

在这里插入图片描述

客户应用带上Access Token访问用户数据:

在这里插入图片描述

资源服务器从请求中取出Access Token:

在这里插入图片描述

校验Access Token具有访问用户数据的权限:

在这里插入图片描述

校验Access Token具有访问用户数据的权限:

在这里插入图片描述

上面的流程中第一步是授权服务器生成Access Token, 在真实流程中,在颁发Token前先要征询用户同意:

在这里插入图片描述

首先客户应用请求Access Token:

在这里插入图片描述

授权服务器征询用户意见,是否将权限授予客户应用:

在这里插入图片描述

如果用户同意授权服务器颁发token:

在这里插入图片描述

授权服务器生成一个Access Token:

在这里插入图片描述

并将token颁发给客户应用:

在这里插入图片描述

注意黄色椭圆圈起来的部分:

在这里插入图片描述

OAuth 2.0标准化了Access Token的请求和响应部分, OAuth2.0的细节在RFC 6749(OAuth 2.0授权框架)中描述:

在这里插入图片描述

通过上面的描述,我们总结出了在OAuth2.0协议中存在四种角色:用户、客户端应用、资源服务器、授权服务器。你可能对这四种角色还是有点迷惑,不清楚它们之间的工作流程。没关系,下面通过一个形象化的例子来描述。

在使用 OAuth2 协议进行第三方授权登录(如使用 QQ 登录淘宝)的场景中,其四种角色之间的工作流程如图所示:
在这里插入图片描述
各个角色的定义如下:

  1. 资源拥有者(Resource Owner)
    资源拥有者是指拥有某些资源(如用户数据、服务访问权限等)的用户。在淘宝登录的例子中,资源拥有者就是想要登录淘宝的用户。他们拥有访问自己淘宝账户的权限,并且可以授权第三方应用(如 QQ )来代表他们访问这些资源。
  2. 客户端应用(Client Application)
    客户端应用是指希望获取资源访问权限的应用程序。在淘宝登录的例子中,淘宝网站或淘宝的移动应用就是客户端应用。它需要用户的授权才能访问用户的 QQ 账户信息,以便完成登录过程。
  3. 授权服务器(Authorization Server)
    授权服务器是负责处理授权请求并颁发访问令牌(Access Token)的服务器。在 QQ 登录淘宝的场景中,QQ 的服务器就是授权服务器。当用户同意授权后,QQ 的服务器会生成一个访问令牌,并将其提供给淘宝的客户端应用。
  4. 资源服务器(Resource Server)
    资源服务器是存储用户资源(如用户数据)的服务器,并根据访问令牌验证请求的合法性。在淘宝登录的例子中,淘宝的服务器就是资源服务器。它接收来自客户端应用的请求,验证附带的访问令牌,如果验证通过,则允许客户端应用访问用户的淘宝账户资源。

OAuth2 协议的流程

  1. 用户尝试使用 QQ 登录淘宝。
  2. 淘宝客户端应用引导用户到 QQ 的授权服务器。
  3. 用户在授权服务器上确认授权,允许淘宝访问其账户信息。
  4. 授权服务器验证用户身份后,生成一个访问令牌并返回给淘宝客户端应用。
  5. 淘宝客户端应用使用这个访问令牌向资源服务器(淘宝服务器)请求用户数据。
  6. 资源服务器验证访问令牌的有效性,如果有效,允许客户端应用访问用户数据,完成登录过程。

在这个过程中,OAuth2 协议确保了用户数据的安全,因为用户可以直接控制哪些应用可以访问他们的数据,而不需要共享他们的用户名和密码。

在上面的第二步骤中,淘宝客户端应用是如何引导用户到 QQ 的授权服务器呢?

在OAuth 2.0授权流程中,客户端应用(在这个场景中是淘宝)需要构造一个特定的URL来引导用户到授权服务器(QQ服务器)进行授权。这个URL包含了几个关键的查询参数,它们的值大多由客户端应用自己确定,但必须符合授权服务器的要求。下面是这些参数的来源和作用:

(1)response_type

  • 内容来源:由客户端应用指定。
  • 作用response_type参数指定了授权服务器应该返回给客户端应用的响应类型。在授权码流程中,这个值通常是code,表示客户端应用请求一个授权码。那么授权服务器在用户授权后会返回一个授权码(Authorization Code),客户端应用随后可以携带这个授权码来请求授权服务器颁发访问令牌(Access Token)。

(2)client_id

  • 内容来源:由授权服务器提供给客户端应用。
  • 作用client_id是客户端应用在注册时从授权服务器获取的唯一标识符。它告诉授权服务器是哪个客户端应用正在请求授权。在 OAuth 2.0 请求中,客户端应用需要提供这个标识符来证明自己的身份。

(3)redirect_uri

  • 内容来源:由客户端应用指定,并且这个redirect_uri必须与在授权服务器注册应用时提供的redirect_uri完全匹配。
  • 作用:这是授权服务器在授权流程结束后,发送用户代理(如浏览器)回到客户端应用的地址。授权服务器将在这个URI上附加授权码或错误信息。

如何理解“客户端应用指定的这个redirect_uri必须与在授权服务器注册应用时提供的redirect_uri完全匹配”?

答:客户端应用在授权服务器注册时会提供一个或多个redirect_uri,这些是客户端应用预先定义好的,授权服务器并不会自动生成这些URI。当客户端应用发起授权请求时,它会在请求中指定一个redirect_uri,这个URI必须是在注册应用时提供给授权服务器的其中之一。也就是说在注册时客户端应用会在授权服务器中提供一堆redirect_uri,但是在发起请求时客户端应用只会指定一个redirect_uri,那么这个redirect_uri就去那一堆redirect_uri中查询,找到匹配的那个redirect_uri即可。

可以用如下三个步骤理解:

  • 注册阶段:当你在授权服务器(如QQ)上注册你的应用(比如淘宝)时,你需要提供一些信息,包括应用名称、应用类型、以及一个或多个redirect_uri。这些redirect_uri是你控制的,用户在授权后将被重定向回的地址。例如,你可能提供https://taobao.com/callback作为一个redirect_uri
  • 授权请求阶段:当你的应用请求用户的授权时,你会构造一个请求URL,包括response_typeclient_idscope等参数,以及你打算使用的redirect_uri。这个redirect_uri必须是你在注册应用时提供给授权服务器的地址之一。例如,你的请求可能包含redirect_uri=https://taobao.com/callback。
  • 安全匹配:授权服务器(QQ)会检查请求中的redirect_uri是否与你注册应用时提供的redirect_uri之一完全匹配。如果不匹配,请求将被拒绝。这是一种安全措施,防止攻击者通过修改redirect_uri来拦截授权码或访问令牌。

(4)scope

  • 内容来源:由客户端应用指定。
  • 作用:定义客户端应用请求访问的权限范围。这些权限由授权服务器预先定义,客户端应用在请求时指定希望获得的权限范围。

然后我们再继续谈引导用户到QQ授权服务器进行授权

客户端应用(淘宝)通过将上述参数附加到授权服务器的授权端点URL上,构造一个完整的URL。然后,客户端应用将用户的浏览器重定向到这个URL。在实际操作中,这通常通过在客户端应用的UI中提供一个“使用QQ登录”的按钮来实现,当用户点击这个按钮时,客户端应用就会执行重定向操作。

举个例子:

假设淘宝客户端应用的client_id123456789,注册的redirect_urihttps://taobao.com/callback,并且希望请求profileemail的权限(scope)。淘宝客户端构造的URL可能如下:

https://graph.qq.com/oauth2.0/authorize?
response_type=code&
client_id=123456789&
redirect_uri=https%3A%2F%2Ftaobao.com%2Fcallback&
scope=profile+email

当用户访问这个URL时,他们将被引导到QQ的授权页面,页面上会显示淘宝请求的权限,并询问用户是否同意授权。如果用户同意,QQ授权服务器将用户重定向回淘宝网站的redirect_uri,并附加一个授权码。

总结来说,response_typeclient_idredirect_uriscope中的大部分内容是由客户端应用根据授权服务器的要求和客户端应用的需求自己生成的,除了client_id是由授权服务器预先分配给客户端应用的。通过构造包含这些参数的URL并引导用户访问,客户端应用可以启动OAuth 2.0授权流程。

下面我们再全面完整地来阐述OAuth 2.0 工作流程(以淘宝网站使用 QQ 登录为例):

  1. 用户尝试使用 QQ 登录淘宝:用户在淘宝网站上点击使用 QQ 登录按钮,淘宝客户端应用发起一个请求到 QQ 授权服务器。

  2. 请求授权:淘宝客户端应用构造一个包含 response_type(通常是 code)、client_id、redirect_uri 和 scope 的请求,引导用户到 QQ 授权服务器进行授权。

  3. 用户授权:用户在 QQ 授权服务器上确认授权,同意淘宝访问其 QQ 账户的特定权限(由 scope 指定)。

  4. 获取授权码:用户同意后,QQ 授权服务器会生成一个授权码,并使用 redirect_uri 将用户重定向回淘宝客户端应用。授权码作为查询参数附加在重定向的 URL 上。

  5. 请求访问令牌:淘宝客户端应用接收到授权码后,使用 client_id 和 client_secret(客户端应用的密钥)向 QQ 授权服务器发送请求,以获取访问令牌。

  6. 获取访问令牌:QQ 授权服务器验证请求的合法性(包括 client_id、client_secret 和授权码),如果验证通过,会返回访问令牌给淘宝客户端应用。

  7. 访问资源:淘宝客户端应用使用获取到的访问令牌向淘宝资源服务器请求用户数据。资源服务器验证访问令牌的有效性后,返回用户数据。

  8. 用户登录成功:淘宝客户端应用使用从资源服务器获取的数据完成用户的登录过程。

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

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

相关文章

快速上手Spring Boot整合,开发出优雅可靠的Web应用!

SpringBoot 1,SpringBoot简介1.1 SpringBoot快速入门1.1.1 开发步骤1.1.1.1 创建新模块1.1.1.2 创建 Controller1.1.1.3 启动服务器1.1.1.4 进行测试 1.1.2 对比1.1.3 官网构建工程1.1.3.1 进入SpringBoot官网1.1.3.2 选择依赖1.1.3.3 生成工程 1.1.4 SpringBoot工程…

JAVA工程师面试专题-JVM篇

目录 一、运行时数据区 1、说一下JVM的主要组成部分及其作用? 2、说一下 JVM 运行时数据区 ? 3、说一下堆栈的区别 4、成员变量、局部变量、类变量分别存储在什么地方? 5、类常量池、运行时常量池、字符串常量池有什么区别? 6、JVM为什么使用元空间替换永久代 二、…

代码随想录算法训练营29期|day57 任务以及具体安排

第九章 动态规划part14 1143.最长公共子序列 /*二维dp数组 */ class Solution {public int longestCommonSubsequence(String text1, String text2) {// char[] char1 text1.toCharArray();// char[] char2 text2.toCharArray();// 可以在一開始的時候就先把text1, text2 轉成…

week04day01(爬虫)

一. 爬虫 只爬取公开的信息,不能爬取未公开的后台数据 1.爬虫的合法性 法无禁止皆可为 -- 属于法律的灰色地带https://www.tencent.com/robots.txt -- 网站/robots.txt 可以查看禁止爬取的内容 2. URL Uniform Resource Locator 统一资源定位符https://www.…

ACL权限-访问控制列表

一、简介 ACL(access control list)访问控制列表,可以对单一的用户或者组设置对文件或目录的独立rwx权限。 二、文件系统是否支持ACL权限 ACL权限是传统的Unix-like操作系统权限的额外支持项目,要有文件系统的支持,目前…

Learn HTML in 1 hour

website address https://www.youtube.com/watch?vHD13eq_Pmp8 excerpt All right, what’s going on? everybody. It’s your Bro, hope you’re doing well, and in this video I’m going to help you started with html; so sit back, relax and enjoy the show. If y…

网络爬虫基础(上)

1. 爬虫的基本原理 爬虫就是在网页上爬行的蜘蛛,每爬到一个节点就能够访问该网页的信息,所以又称为网络蜘蛛; 网络爬虫就是自动化从网页上获取信息、提取信息和保存信息的过程; 2. URL的组成部分 URL全称为Uniform Resource L…

基于Mapbox展示GDAL处理的3D行政区划展示实践

目录 前言 一、Gdal数据处理 1、数据展示 2、Java数据转换 二、Mapbox可视化 1、定义Mapbox地图 2、地图初始化 3、创建地图 三、界面优化 1、区域颜色设置 2、高度自适应和边界区分 3、中文标注 总结 前言 最近有遇到一个需求,用户想在地图上把行政区划…

Android 9.0 禁用插入耳机时弹出的保护听力对话框

1.前言 在9.0的系统rom定制化开发中,在某些产品中会对耳机音量调节过高限制,在调高到最大音量的70%的时候,会弹出音量过高弹出警告,所以产品 开发的需要要求去掉这个音量弹窗警告功能,接下来就来具体实现这个功能 2.禁用插入耳机时弹出的保护听力对话框的核心类 framework…

浅谈ORM框架

文章目录 一、什么是ORM框架?二、常见的ORM框架(持久层框架)2.0 什么是持久化2.1 Hibernate2.1.1、Hibernate的使用步骤 2.2 mybatis2.3 mybatis plus2.4 jpa springdata2.5 jfinal 三、ORM框架的优缺点?3.1 优点3.1.1、减少代码的重复量,提高…

Android 基础技术——Framework

笔者希望做一个系列,整理 Android 基础技术,本章是关于 Framework 简述 Android 系统启动流程 当按电源键触发开机,首先会从 ROM 中预定义的地方加载引导程序 BootLoader 到 RAM 中,并执行 BootLoader 程序启动 Linux Kernel&…

使用Flex布局在HTML中实现双行夹批效果

古代小说中经常有评点和批注,为了区别正文和批注,一般将批注排版成双行夹批的形式。我们知道,在Word中只需要先选择批注文字,然后通过“开始”菜单“段落”面板上字符缩放工具组里的“双行合一”命令,就可以很容易实现…

Android13 针对low memory killer内存调优

引入概念 在旧版本的安卓系统中,当触发lmk(low memory killer)的时候一般认为就是内存不足导致,但是随着安卓版本的增加lmk的判断标准已经不仅仅是内存剩余大小,io,cpu同样会做评判,从而保证设备…

vue实现列表自动无缝滚动列表

大家好,今天给大家分享的知识是vue基于vue-seamless-scroll实现自动无缝滚动列表 一、实现自动滚动 最近在开发过程中遇到一个问题,就是需要实现自动滚动列表,效果图如下 就是这样一个列表在自动循环展示。在这里我是运用的 vue-seamless-sc…

HTTP的详细介绍

目录 一、HTTP 相关概念 二、HTTP请求访问的完整过程 1、 建立连接 2、 接收请求 3、 处理请求 3.1 常见的HTTP方法 3.2 GET和POST比较 4、访问资源 5、构建响应报文 6、发送响应报文 7、记录日志 三、HTTP安装组成 1、常见http 服务器程序 2、apache介绍和特点 …

专转本的三道难关

道阻且长,路途中的艰辛只有亲身经历过转本的人才能感同身受,这三道难关也是每个升本人都会经历的。尤其是最后一个(o(╥﹏╥)o)!!! 01 选择大于努力 很多人想专转本都是为了圆本科的梦&a…

redis的缓存穿透,缓存并发,缓存雪崩,缓存问题及解决方案

缓存穿透 问题原因 解决方案 缓存并发 缓存雪崩 缓存失效时间设置一致导致的。 解决方案: 1)方案一 2)方案二 如何设计一个缓存策略,缓存热点数据?

实现RAG管道中的上下文压缩和过滤

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research),及时查看最新内容 原文标题:Implement Contextual Compression And Filtering In RAG Pipeline 原文地址:https://medium.…

新版AI系统ChatGPT源码支持GPT-4/支持AI绘画去授权

源码获取方式 搜一搜:万能工具箱合集 点击资源库直接进去获取源码即可 如果没看到就是待更新,会陆续更新上 新版AI系统ChatGPT网站源码支持GPT-4/支持AI绘画/Prompt应用/MJ绘画源码/PCH5端/免授权,支持关联上下文,意间绘画模型…

[极客挑战2019]HTTP

这道题考察的是http请求头字段的含义和使用; 具体如下 Referer:来源地址 User-Agent:客户端配置信息:浏览器类型、版本、系统类型等 X-Forwarded-For:代理地址,即数据发出的地址 开始解题:(对我这初学者真的烧脑&a…