Day982.各大开放平台是如何使用OAuth 2.0 -OAuth 2.0

news2024/11/18 1:28:56

各大开放平台是如何使用OAuth 2.0

Hi,我是阿昌,今天学习记录的是关于各大开放平台是如何使用OAuth 2.0的内容。

开放平台”,不难理解,它的作用就是企业把自己的业务能力主要以开放 API 的形式,赋能给外部开发者。而作为第三方开发者或者 ISV(独立软件供应商)在接入这些开放平台的时候,最应该关心的就是它们的官方文档,关注接入的流程是怎样的、对应的 API 是什么、每个 API 都传递哪些参数,也就差不多够了。到这里,会发现“开放平台的官方文档”会是一个关键点。不过呢,当去各大开放平台上面看这些文档的时候,就会发现这些文档非常分散。其中的原因也很简单,那就是开放平台为了让已经具备 OAuth 2.0 知识的研发人员去快速地对接平台上面的业务,把各类对接流程做了分类归档。比如,会发现微信开放平台上有使用授权码获取授权信息的文档,也有获取令牌的文档,但并没有一份整体的、能够串起来的文档说明。从一个角度来看,这其实也就间接提高使用门槛,因为如果你不懂 OAuth 2.0,基本是没办法理解那些分类的。下面以京东、微信、支付宝、美团为代表的各大开放平台是如何使用 OAuth 2.0 的。

先来看看大厂的开放平台全局体系,各个开放平台基本的系统结构和授权系统在中间的交互流程,大同小异,都是通过授权服务来授权,通过网关来鉴权。

所以接下来,以京东商家开放平台为例,来说说开放平台的体系。


一、开放平台体系是什么样子的?

先来看一下京东商家开放平台全局体系的结构,如下图所示。

图1 京东商家开放平台体系结构示意图

可以把这个架构体系分为三部分来看:

  1. 第三方软件,一般是指第三方开发者或者 ISV 通过对接开放平台来实现的应用软件,比如打单软件。
  2. 京东商家开放平台,包含 API 网关服务、OAuth 2.0 授权服务和第三方软件开发者中心服务。其中,API 网关服务和 OAuth 2.0 授权服务,是开放平台的“两条腿”;第三方软件开发者中心服务,是为开发者提供管理第三方软件应用基本信息的服务,比如 app_id、app_secret 等信息。
  3. 京东内部的各个微服务,比如订单服务、商品服务等。这些微服务,就是之前提到的受保护资源服务。

从图中还可以看到这个体系整体的调用关系是:第三方软件通过 HTTP 协议请求到开放平台,更具体地说是开放平台的 API 网关服务,然后由 API 网关通过内部的 RPC 调用到各个微服务

接下来,再以用户小明使用打单软件为例,来看看这些系统角色之间具体又是怎样交互的?

图2 开放平台体系交互示意图

可以发现,在开放平台体系中各个系统角色间的交互可以归结为:

  1. 当用户小明访问小兔软件的时候,小兔会首先向开放平台的 OAuth 2.0 授权服务去请求访问令牌,接着小兔拿着访问令牌去请求 API 网关服务;
  2. 在 API 网关服务中,会做最基本的两种校验,一种是访问令牌的合法性校验,比如访问令牌是否过期的校验,另一种是小兔打单软件的基本信息的合法性校验,比如 app_id 和 app_secret 的校验;
  3. 都校验成功之后,API 网关服务会发起最终的数据请求。

验证访问令牌或者第三方软件应用信息的时候,都是在受保护资源服务中去做的。当有了 API 网关这一层的时候,这些校验工作就会都落到了 API 网关的身上,因为我们不能让很多个受保护资源服务做同样的事情。理解了京东商家开放平台的体系结构后,可以小结下了。

依靠开放平台提供的能力,可以说开放平台、用户和开发者实现了三赢:

  • 小明因为使用小兔提高了打单效率;
  • 小兔的开发者因为小明的订购服务获得了收益;
  • 通过开放出去的 API 让小兔帮助小明能够极快地处理 C 端用户的订单,京东提高了用户的使用体验。

但同时呢,开放也是一把双刃剑。理想状态下,平台、开发者、用户可以实现三赢,安全的问题绝不容忽视,而用户的信息安全又是重中之重。


开放平台体系是如何解决访问令牌安全问题的案例

用户给第三方软件授权之后,授权服务就会生成一个访问令牌,而且这个访问令牌是跟用户关联的。比如,小明给小兔打单软件进行了授权,那么此时访问令牌的粒度就是:小兔打单软件 + 小明。

小兔打单软件可以拿着这个访问令牌去代表小明访问小明的数据;如果访问令牌过期了,小兔打单软件还可以继续使用刷新令牌来访问,直到刷新令牌也过期了。

现在问题来了,如果小明注销了账号,或者修改了自己的密码,那他之前为其它第三方软件进行授权的访问令牌就应该立即失效。否则,在刷新令牌过期之前,第三方软件可以一直拿着之前的访问令牌去请求数据。这显然不合理。

所以在这种情况下,授权服务就要通过 MQ(消息队列)接收用户的注销和修改密码这两类消息,然后对访问令牌进行清理。(这里也会出现消息发出和执行的中间差问题

图3 访问令牌的清理

其实,这个案例中解决访问令牌安全问题的方式,不仅仅适用于开放平台,还可以为在企业内构建自己的 OAuth 2.0 授权体系结构时提供借鉴。以上就是开放平台整体的结构,以及其中需要重点关注的用户访问令牌的安全性问题了。

作为第三方软件开发者,在对接到这些开放平台或者浏览它们的网站时,几乎都能看到类似这样的一句话:“所有接口都需要接入 OAuth 授权,经过用户确认授权后才可以调用”,这正是 OAuth 2.0 的根本性作用。


二、各大开放平台授权流程

以微信、支付宝、美团为例,看看它们在开放授权上是如何使用 OAuth 2.0 的。

首先看一下官方的授权流程图:

图4 微信开放平台授权流程图

引自微信官方文档

图5 支付宝开放平台授权流程图

引自支付宝开放平台文档

在这里插入图片描述

引自美团外卖开放平台

可以在这三张授权流程图中看到,都有和授权码 code 相关的文字。这就说明,它们都建议开发者首选授权码流程。作为开发者在对接开放平台的时候,最关心的就是它们提供的官方对接文档了。这些文档里面,最让人头疼就是那些通信过程中需要传递的参数了。


以京东商家开放平台为例,给串下这些参数背后的含义,以及关键点。这样在做具体接入操作的时候,就可以举重若轻了。

授权码流程中的参数说明概括来讲,在京东商家开放平台的授权服务这一侧,提供服务的就是两个端点:

三、授权码流程中的参数说明

  • 负责生成授权码的授权端点以及负责颁发访问令牌的令牌端点。整个授权过程中,虽然看着有很多参数,但可以围绕这两条线,来对它们做归类。接下来,继续以小兔打单软件为例,来看一下它在对接京东商家开放平台的时候都用到了哪些参数。

小明在使用小兔打单软件的时候,首先被小兔通过重定向的方式引导到京东商家开放平台的授权服务上,其实就是引导到了授权服务的授权端点上。这个重定向的过程中用到的参数如下:

在这里插入图片描述

这里需要强调的是,对于 state 参数,现在官方都是“推荐”使用。OAuth 2.0 官方建议的避免 CSRF 攻击的方式,就是使用 state 参数。所以安全起见,还是应该使用。

接着,京东商家开放平台授权服务的授权端点,会向小兔软件做出响应。这个响应的过程用到的基本参数,如下:

图8 授权端点响应小兔软件用到的参数

对于授权码 code 的值,一般建议的最长生命周期是 10 分钟。另外,小兔打单软件只能被允许使用一次该授权码的值,如果使用一次之后还用同样的授权码值来请求,授权服务必须拒绝。

对于这次的 state 值,授权服务每次都是必须要返回给小兔打单软件的。无论小兔打单软件在起初的时候有没有发送该值,都必须返回回去,如果没有就返回空。

这样当小兔打单软件日后升级增加该值的时候,京东商家开放平台就不需要改动任何代码逻辑了。

在拿到授权码 code 的值之后,接下来就是小兔打单软件向京东商家开放平台的授权服务的令牌端点发起请求,申请访问令牌。

这个过程中需要传递的基本参数,如下:
图9 申请访问令牌需要传递的基本参数

在授权服务接收到小兔打单软件申请访问令牌的请求后,像授权端点一样,令牌端点也需要向小兔打单软件做出响应。

这个过程涉及到的基本参数,如下:

图10 令牌端点响应小兔软件涉及的参数

对于这里返回的 scope 值,要强调下,其实就是小兔软件被允许的实际的权限范围,因为小明有可能给小兔软件授予了小于它在开放平台注册时申请的权限范围。

比如,小兔打单软件申请了查询历史订单、查询当天订单两个 API 的权限,但小明可能只给小兔授权了查询当天订单 API 的权限。


三、总结

开放平台体系的整体结构和授权流程,以及第三方软件开发者关心的对接开放平台的通信流程中需要传递的参数。以下三点内容。

  1. 当有多个受保护资源服务的时候,基本的鉴权工作,包括访问令牌的验证、第三方软件应用信息的验证都应该抽出一个 API 网关层,并把这些基本的工作放到这个 API 网关层。
  2. 各大开放平台都是推荐使用授权码许可流程,无论是网页版的 Web 应用程序,还是移动应用程序。
  3. 对于第三方软件开发者重点关注的参数,可以从授权服务的授权端点和令牌端点来区分,授权端点重点是授权码请求和响应的处理,令牌端点重点是访问令牌请求和响应的处理。

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

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

相关文章

C++(Chapter 3)

C(三) 1.引用 1.引用的概念 引用的概念:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 引用的语法:类型& 引用变量名(对象名) 引用实体 ; 例如: #i…

【OpenGL】七、混合

混合 文章目录 混合混合公式glBlendFunc(混合函数)glBlendFuncSeparate渲染半透明纹理 参考链接 混合(Blending)通常是实现物体透明度(Transparency)的一种技术 简而言之:混合就是如何将输出颜色和目标缓冲区颜色结合起来。 混合公式 C_fina…

Android 备忘录,记事本程序设计

android备忘录实现,使用ObjectBox数据库框架进行数据存储,增删改查等操作。代码使用kotlin编写。 1、下面看看ObjectBox数据库封装 需要注意的是: /** * 你只有配置好之后, 点击 Make Model 你的model名字, 才会创建 MyObjectBox对象 …

(十七)VBA常用基础知识:读写text文件

读取文件 1.1.数据准备 1.2 代码准备 Sub test()Dim buf As String, n As LongOpen "/Users/sixdog/Documents/VBA/test.txt" For Input As #1Do Until EOF(1)Line Input #1, bufn n 1Sheet1.Range("A" & n) bufLoopClose #1 End Sub1.3 执行结果…

在Unity中如何设置设备的高、中、低配

在开发游戏或应用程序时,考虑到不同设备的性能差异是至关重要的。Unity作为一种流行的游戏开发引擎,提供了一些方法来区分设备的高、中、低配,并相应地调整游戏的性能要求和图形质量。 以下是在Unity中实现这一目标的几种常用方法&#xff1…

【Linux】零基础入门Linux你所需要掌握的

文章目录 目录结构路径描述颜色区分Linux命令文件权限 目录结构 要了解Linux首先,必须要了解linux的目录层级结构,因为在linux中有一切皆文件"的思想. windows系统里面的文件具有各个盘符,如C盘,D盘等 而在Linux中,Linux的目录结构是一个树型结构 Linux没有盘符的概念,只…

程序的编译,链接,执行

目录 1.程序的翻译环境和执行环境 2.翻译环境 3.运行环境 1.程序的翻译环境和执行环境 当我们写出一段代码后,我们需要将代码运行起来。那在这个过程中文件是如何从代码变成可执行程序的呢? 在程序实现过程中中,存在两个环境:一…

Matlab安装必看,手把手教你安装matlab

目录 一 ,Matlab介绍 二,安装matlab2021b 一 ,Matlab介绍 Matlab是一种高级计算机语言和交互式环境,广泛用于科学、工程、金融和其他领域的数据分析、可视化和数值计算。它是由MathWorks公司开发的,最初发布于1984年…

【unity3D插件】Embedded Browser(ZFBrowser) — 快速实现PC端内嵌网页(有详细图解)

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity3D插件—Embedded Browser 这里写自定义目录标题 下载基础知识基础操作使用公网网址加载一个网页①使用公网网址加载一个网页②使用…

IP子网到底怎么划分【全网最详解】!!!

在学习IP子网划分前,首先的明白以下几个基础概念: 1、IP地址组成 IP地址由32位二进制组成,32位二进制分成了4字节,每字节8位,字节之间用符.(点)分隔,为了方便人们记忆,经…

Leetcode刷题详解——搜索插入位置

1. 题目链接:35. 搜索插入位置 2. 题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。…

判断函数是否标记async

判断函数是否标记为async 今天看到这道题觉得蛮有意思的 就是说让你写一个工具类,让后这个工具类接收一个函数,判断这个函数是不是被async标记了 如下,我们先看看普通函数和被async标记的函数打印出来是啥样子 function isAsyncFunction(func) {console.log(func)}isAsyncFun…

css样式中 before、after 里面的 content 乱码

目录 一、问题 二、原因 三、总结 一、问题 1.代码在本地没有问题,打包放在线上在时候,竟然测试测的时候看到element的字体图标有时候显示乱码,如下图1-1所示。更奇葩的是偶现,只有测试看见了,很难复现。。。 图1-…

【网络协议】聊聊UDP协议

前面的几篇文章讲述了链路层和IP层,主要的话其实就是MAC地址,以及通过IP地址求MAC地址的ARP协议。PING的底层协议 ICMP 。动态分配IP协议 DHCP等。而从今天开始我们开始讲述传输层协议,传输层主要就是UDP和TCP。 TCP 和 UDP 有哪些区别&…

Bean转换工具MapStruct看这一篇就够了

内容持续更新中… 文章目录 1.背景2.mapstruct简介3.mapstruct与其他映射对比4.mapstruct底层原理解析5.具体使用和底层实现5.1 添加maven依赖5.2 对象转换1.UserA和UserB字段相同2.UserA和UserB字段不同3.多个源类4.子对象映射5.数据类型转换数据类型映射枚举映射 6.集合映射…

C语言KR圣经笔记 2.1变量名 2.2 数据类型和大小

第2章 类型、操作符和表达式 变量和常量是程序里操作的基本数据对象。声明列出了要使用的变量,并指出它们的类型,还可能赋初始值。而操作符指定了要对它们做什么。表达式把变量和常量结合起来产生新的值。一个对象的类型决定了它的取值范围以及能对它做…

Linux部署Redis哨兵集群 一主两从三哨兵(这里使用Redis6,其它版本类似)

目录 一、哨兵集群架构介绍二、下载安装Redis2.1、选择需要安装的Redis版本2.2、下载并解压Redis2.3、编译安装Redis 三、搭建Redis一主两从集群3.1、准备配置文件3.1.1、准备主节点6379配置文件3.1.2、准备从节点6380配置文件3.1.3、准备从节点6381配置文件 3.2、启动Redis主从…

【Kotlin精简】第6章 反射

1 反射简介 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。 1.1 Kotlin反射 我们对比Kotlin和Java的反射类图。 1.1.1 Kotlin反射常用的数据结…

【反悔贪心】2022ICPC南京 G

Problem - G - Codeforces 题意 思路 首先容易发现,合并操作对平均攻击力有贡献,但是加一个1就没有贡献,因此首先考虑每次遇到0的时候都合并 但是很快发现如果这样的话,遇到-1就不一定有足够的1给你合并,因此在遇到…

Vite创建vue3+ts+pinia+vant项目起步流程

pnpm介绍&安装 本质上他是一个包管理工具,和npm/yarn没有区别,主要优势在于 包安装速度极快磁盘空间利用效率高 安装: npm i pnpm -g使用: npm命令pnpm等效npm installpnpm installnpm i axiospnpm add axiosnpm i webpa…