如何在Postman集合中保留OAuth2令牌(或使用刷新令牌)?

Nat*_*ter 28 oauth oauth-2.0 postman

目标

在运行集合之前,无需单独执行每个调用的授权过程即可运行集合.

我试过/注意到了什么

  1. 在Postman中使用OAuth2授权助手时,我还没有发现保存返回的刷新令牌的方法,因此在访问令牌到期时使用它来获取新的令牌.(我已经建议将这个功能放在Postman Github问题的帮手中.)

  2. 我已经尝试在集合的开头创建一些步骤来复制帮助程序,但无法通过需要用户交互来批准/拒绝的步骤(这是有道理的,否则会带来安全风险).但是,我似乎无法弄清楚如何以OAuth2助手的方式提示用户.

  3. 关于刷新令牌,我已经把我的期望提高了一个档次,并认为我可以在列表中的第一个测试中运行身份验证,以某种方式在全局或环境变量中保存访问令牌,然后在所有后续测试,但我还没有找到一种方法来保存通过OAuth2助手生成的访问令牌.

我很想知道是否有一个解决方案,这使得集合能够以最小的努力运行授权.对于所有使用OAuth2授权的集合中编写的更多测试,这变得更加重要.

旁注:我一直在使用Postman mac客户端,以防我不知道的客户端有所不同.

Per*_*ega 43

好的,首先输入您的OAUTH令牌URL,单击Body选项卡,然后填写这些POST参数:client_id,grant_type,username,password,override.

在此输入图像描述

然后,单击"测试"选项卡,输入此文本,然后按"发送":

var data = JSON.parse(responseBody);
postman.setGlobalVariable("access_token", data.access_token);
postman.setGlobalVariable("refresh_token", data.refresh_token);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后输入您的一个应用程序URL,单击Headers选项卡,然后输入一个带有Bearer {{access_token}}值的参数Authorization.然后单击"发送".

在此输入图像描述

瞧!

  • 谢谢,你的答案很棒!你可以通过举例说明如何使用refresh_token来完成它. (3认同)

Nat*_*ter 15

在github上找到了答案.

首先,设置这些环境变量:

  • url :(您的API端点)
  • access_token :(空白)
  • refresh_token :(空白)
  • client_id :(您的client_id)
  • client_secret :(你的client_secret)
  • username : (您的用户名)
  • password : (你的密码)

接下来,创建一个access_token使用the 的新调用password grant_type.

在我的情况下,我发布到{{url}}/access_token.通过此调用发送的是以下信息,作为form-data"正文"选项卡中指定的键/值对:

  • grant_type : password
  • username : {{username}}
  • password : {{password}}
  • client_id : {{client_id}}
  • client_secret : {{client_secret}}

发送此P​​OST将导致类似此响应:

{
  "access_token": "kciOMpcmRcGTKfoo",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "DMGAe2TGaFbar"
}
Run Code Online (Sandbox Code Playgroud)

然后,在Tests选项卡中,我添加了以下代码来分配两个环境变量,access_tokenrefresh_token.

var data = JSON.parse(responseBody);
postman.setEnvironmentVariable("access_token", data.access_token);
postman.setEnvironmentVariable("refresh_token", data.refresh_token);
Run Code Online (Sandbox Code Playgroud)

注意:我也在那里进行测试,只是为了确保至少这个调用也能正常工作,尽管这与原始问题无关:

var jsonData = JSON.parse(responseBody);
tests["token_type is Bearer"] = jsonData.token_type === "Bearer";
Run Code Online (Sandbox Code Playgroud)

现在,任何新的呼叫创建可以使用access_token由第一呼叫作为这样的一个环境变量产生:{{access_token}}.在我的情况下,我转到呼叫/测试中的标题选项卡并添加此密钥/对:

  • Authorization : Bearer {{access_token}}

加分点:我这里没有给出一个例子,但理论上我可以添加一个预先请求脚本来测试access_tokenAPI 的当前(非空白),如果失败,使用给定的(非非)获取新的空白)refresh_token.这样就可以了,所以我不必担心访问令牌过期.

这一切都说,我不喜欢这个解决方案,因为它需要将第一个access_token调用添加到我的集合中的每个子文件夹,因为如果我只想运行一个子文件夹而不是整个集合,我需要制作我确定我有一个新的access_token.不这样做意味着当access_token到期时,所有测试都将失败.如果您从未在Collection Runner中单独运行子文件夹,则只需创建一个access_token调用并将其设置为在集合中运行的第一个调用即可.

但是,出于这个原因,我不打算将此标记为正确答案.我猜测有一个比我想出的更好的答案 - 理想情况下我不需要在每个子文件夹中复制相同的access_token调用/测试,但确实获得了自动化,非交互式的好处测试具有自行运行子文件夹或整个集合的灵活性.


Hey*_*iko 5

首先,从线程中阅读此答案。现在,考虑这个问题的后半部分(基于评论):

如何使用刷新令牌?

  1. 创建一个新的 POST 请求(最容易复制您创建的用于获取 access_token 的请求)。

在此处输入图片说明

  1. 在正文中,删除usernamepassword。替换grant_type为“refresh_token”。添加refresh_token值“{{refresh_token}}”,这是对您第一次授权时创建的变量的引用(您还记得阅读这个答案吗?

在此处输入图片说明

  1. 确保刷新请求的测试部分覆盖了 access_token 和 refresh_token 的 Postman 变量。为什么?因为每当您执行刷新时,您都会获得另一个刷新令牌。如果您不捕获那个新的刷新令牌,您最终将使用旧的刷新令牌并且 API 将拒绝它。然后你需要从第一步(即从这个答案)重新运行整个过程。

在此处输入图片说明

  1. 现在,当您的授权到期时,您无需运行包含您的用户名和密码的原始请求。您可以使用我们刚刚创建的请求永久刷新。当您进行协作并需要共享 API 访问权限,但又不想共享用户名/密码时,这尤其有用。

哼!