教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

智极拓荒说
• 阅读 199

Apifox 2.5.15 及以上版本已支持根据 OAuth 2.0 协议规范直接获取访问令牌,无需在其它工具中生成后再粘贴过来。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

Apifox 支持 OAuth 2.0 协议定义的五种常见授权模式,它们分别如下:

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

在众多授权模式中,最常见和最经典的授权模式是 Authorization Code (授权码模式) ,接下来,我们将以阿里云 OAuth 2.0 登录为例,在 Apifox 中详细介绍如何配置该模式。在正式开始实践之前,我们先来温习一下什么是 OAuth 2.0!

什么是 OAuth 2.0

OAuth 2.0 是一种授权框架,它可以让第三方应用程序在得到你的授权后,有限度地访问一些开放的个人信息。

OAuth 2.0 的运行流程可以用下图表示,其中,客户端代表一方,用户为另一方,认证服务器与资源服务器统一作为一方。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

在实际应用中,我们可以简化为 3 步来理解:

  1. 获取授权码 (code) :比如你在一个网站中使用微信扫码登录,这就是一种授权,这一步可以让客户端拿到授权码
  2. 根据授权码向第三方平台的 OAuth 2.0 服务申请访问令牌 (Token) :客户端使用授权码向认证服务器申请访问令牌,这个令牌允许客户端在一段时间内访问用户的受保护资源。
  3. 根据令牌 (Token) 获取第三方平台的开放资源:客户端使用获得的访问令牌去访问资源服务器,以获取用户授权范围内的受保护资源。

用一条公式来简化,可以简单表示为:授权码 (code) + 访问令牌 (Token) = 开放资源。这个公式概括了整个 OAuth 2.0 的主流程,即通过授权码获取访问令牌,然后利用令牌去访问开放资源。

我们将通过一个阿里云 OAuth 2.0 登录的例子来进一步实践一下,并讲述如何在 Apifox 中调试。

授权码模式的 OAuth2.0 鉴权

1 获取客户端 ID 和客户端密钥**

我们首先需要到 OAuth 2.0 服务提供者的后台获取到客户端 ID (Client ID) 和客户端密钥 (Client Secret) ,在阿里云中,你需要到 RAM控制台新建一个 OAuth 应用,里面的应用 ID 就是客户端 ID (Client ID)

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

然后在应用中,创建一个密钥,创建时显示的 AppSecretValue 就是客户端密钥 (Client Secret) ,只显示一次,记得保存好,忘记了需要重新生成。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

当客户端 ID 和客户端密钥有了之后,我们可以在 Apifox 中先配置这两个信息。打开任一接口或目录,选择「修改文档 -> Auth -> OAuth 2.0」选项。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

Apifox 中 OAuth 2.0 默认选择的授权模式为 Authorization Code (授权码模式) ,本例就是用的这个模式,所以无需在页面配置项中进行更改。在下方找到 Client ID 和 Client Secret,将从阿里云中获取到的应用 ID 和密钥分别填进去即可。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

2 配置授权码的请求地址

根据阿里云官方文档的描述,在进行 OAuth 2.0 认证时,授权码的请求地址 (Auth URL) 是:

https://signin.aliyun.com/oauth2/v1/auth

将这个授权码的请求地址填写到 Auth URL 里即可,这个地址我们可以把它理解为登录授权页面,在首次校验登录状态时会打开这个页面 (客户端内为窗口) ,然后让你填写用户名和密码。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

一般在手动构造登录授权页面的时候,这个授权地址的后面还需要携带一些参数,比如像这样的:

https://signin.aliyun.com/oauth2/v1/auth?
client_id=123****&
redirect_uri=https://example.com/authcallback/&
response_type=code&
scope=openid /acs/ccc&
access_type=offline&
state=123456****

需要注意的是,正常情况下无需进行参数换行。

但是,在 Apifox 中,后面的参数一般就不需要了,只要问号 ? 前面的路径就行,因为其它必填参数已单独在其它选项中配置,当然如果你想携带一些 Query 参数,你也可以加上,点击该输入框后面的图标即可添加:

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

3 配置回调地址

回调地址 (Callback URL) 一般是自己的服务器的一个地址,这个地址需要配置到 OAuth 2.0 服务提供者的后台,开发时一般使用本地服务器 (比如:http://127.0.0.1:8080/callback 。在阿里云中,点击「编辑基本信息」并填入回调地址即可。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

我们需要“回调地址”的目的是为了获取到地址栏上的授权码 (code) ,在上文的“步骤二”中,我们在登录页填写完用户名密码后,就会重定向到“回调地址”,并能在地址栏中获取授权码 (code) 。形如下面这个用手动的方式获取 code 值的地址栏:

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

OAuth 2.0 服务提供者后台里填写的回调地址是什么,我们在 Apifox 中就填上对应的回调地址(Callback URL)。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

需要注意的是,如果你用的是 Apifox 的网页端,那么必须将 OAuth 2.0 服务提供者后台的回调地址指定为https://app.apifox.com/oauth2-browser-callback.html,同样该地址也需要在 Apifox 中填写,否则重定向会失败,就获取不到授权码 (code) 了。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

4 配置访问令牌的请求地址

根据阿里云官方文档的描述,使用授权码 (code) 向阿里云 OAuth 2.0 服务申请访问令牌 (Token) 时,它的请求地址为:

https://oauth.aliyun.com/v1/token

将这个访问令牌的请求地址填写到 Access Token URL 里即可。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

5 获取令牌与使用

最后,当客户端 ID (Client ID) 、客户端密钥 (Client Secret) 、授权码的请求地址 (Auth URL) 、回调地址 (Callback URL) 和访问令牌的请求地址 (Access Token URL) 都配置完毕后,我们就可以点击「获取 Token」按钮来调试了,点击后会弹出一个授权登录框,你可以在这里填写用户名密码,或者通过手机扫码的方式来登录。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

填写用户名密码后,点击登录,你会看到 Token 已成功获取。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

获取 Token 成功后,界面上会展示 Token 内容及其有效期。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

有了 Token 后就可以在接口中发送请求,已生成的 Token 会自动附加到请求头的 Authorization 中,添加至 Bearer 后发送出去。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

如果你要将 Token 携带在 URL 上,你也可以在页面的配置项中修改 Token 的「添加位置」,将其选择为「Query Params」即可。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

至此,我们通过“阿里云 OAuth 2.0 登录”的例子,从头跑了一遍流程,最终成功获取了 Token,一般必要的操作以及配置项就是上文所述步骤的内容,其它的可用配置项请见下文。

其他 配置项

 ”在 Token 返回后,Apifox 会自动解析 OAuth 2.0 服务返回的其它信息,比如阿里云的 OAuth 2.0 服务会返回以下的字段:

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

在 Apifox 中,会自动将这些返回的字段解析出来,你可以点击 Token 后面的小眼睛查看:

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

如果 OAuth 2.0 服务同时返回了 Access Token 和 ID Token,Apifox 会默认使用 Access Token。如果希望切换至 ID Token,那么可以在「使用的 Token 类型」选项中切换至 ID Token。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

如果 OAuth 2.0 服务返回了 Refresh Token,将会出现「刷新 Token」按钮。当 Token 过期了,点击「刷新 Token」 按钮即可直接获取新的 Token,而不会弹出登录窗口。

OAuth 2.0 服务的登录页面会记录用户的登录状态,重新获取 Token 时默认会使用上一次登录的账号。若希望更换账号,则可以点击「清除 Cookies」按钮,再点击「获取 Token」。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

你还可以点击「更多」选项添加更多加密设置。如果配置留空,它们会自动生成。

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

以下是各个配置项的解释:

教程:使用 Apifox 配置 OAuth 2.0 并快速取得访问令牌

注意事项

Apifox 现支持根据 OAuth 2.0 标准协议规范获取 Token,这意味着只有当第三方平台的 OAuth 2.0 认证也遵循标准的协议规范时,才能成功获取 Token,否则会失败。

目前国内许多平台提供的 OAuth 2.0 认证流程并未完全遵循协议规范,它们更注重只要能通过代码获取到 Token 就行,但是获取到 Token 之前需要践行的配置规范往往自成一派,所以你在 Apifox 中调试的时候会遇到报错。

针对这种情况,我们推荐你用手动的方式来构造登录页面,也就是配置「授权码的请求地址」,当请求地址在网页中成功重定向并获得授权码 (code) 后,再使用 Apifox 来发送获取 Token 的请求,这种方法虽然稍显繁琐,但能有效解决问题。具体操作方法,可参考这篇文章《最佳实践 | 如何使用 Apifox 调试 OAuth 2.0 鉴权的接口》,该文是在 Apifox 尚未直接支持 OAuth 2.0 调试功能时编写的。

OAuth 2.0 鉴权流程归纳如下:

  1. 获取客户端 ID 和客户端密钥:在 OAuth 2.0 服务提供者后台获取
  2. 配置授权码请求地址:填写 OAuth 2.0 服务提供者的授权码请求地址,如阿里云的
    https://signin.aliyun.com/oauth2/v1/auth
  3. 配置回调地址:设置回调地址,获取授权码
  4. 配置访问令牌请求地址:填写访问令牌的请求地址,如阿里云的
    https://oauth.aliyun.com/v1/token
  5. 获取令牌与使用:在 Apifox 中,点击「获取 Token」按钮,填写登录信息或扫码登录,获取 Token 后即可发送请求

额外配置项包括 Scope、State、Credentials 等。注意,Apifox 支持标准 OAuth 2.0 协议规范,若第三方平台 OAuth 2.0 认证未遵循规范,可能无法成功获取 Token。建议如遇问题,手动构造登录页面后再使用 Apifox 发送获取 Token 的请求。

更多关于 OAuth 2.0 的知识可以查看:

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这