如何在Postman集合中持久化OAuth2令牌(或使用刷新令牌)?

pw9qyyiw  于 2023-01-01  发布在  Postman
关注(0)|答案(5)|浏览(356)
    • 目标**

能够运行收集,而无需在运行收集之前单独经历每个调用的授权过程。

    • 我所尝试/注意到的**

1.当在Postman中使用OAuth2授权助手时,我还没有发现一种方法来保存返回的刷新令牌,从而在访问令牌过期时使用它来获取一个新的令牌。(我建议将此功能放在Postman Github问题中的助手中。)
1.我尝试过在集合的开始创建一些步骤来复制帮助器,但是无法通过需要用户交互来批准/拒绝的步骤(这是有意义的,因为否则会有安全风险)。但是,我似乎也不知道如何像OAuth2帮助器那样提示用户。
1.我对刷新令牌的期望降低了一个档次,认为可以简单地在列表中的第一个测试上运行身份验证,以某种方式将访问令牌保存在全局变量或环境变量中,然后在所有后续测试中使用该令牌,但我还没有找到保存通过OAuth2帮助器生成的访问令牌的方法。
我很想知道是否有一个解决方案可以让集合在授权上花费最少的精力就可以运行。随着在集合中编写的测试越来越多,并且所有测试都使用OAuth2授权,这一点就变得更加重要了。
边注:我一直在使用 Postman mac客户端,以防有一个不同的客户端,我不知道。

u5rb5r59

u5rb5r591#

好的,首先输入OAUTH令牌URL,单击Body选项卡,然后填写以下POST参数:客户端ID、授权类型、用户名、密码、覆盖。

然后,单击Test(测试)选项卡,输入以下文本,然后按Send(发送):

var data = JSON.parse(responseBody);
postman.setGlobalVariable("access_token", data.access_token);
postman.setGlobalVariable("refresh_token", data.refresh_token);

然后输入一个应用程序URL,单击"标题"选项卡,并输入参数Authorization with a value Bearer {{access_token}}。然后单击"发送"。

瞧!

eblbsuwk

eblbsuwk2#

我在github上找到了答案。
首先,设置以下环境变量:

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

接下来,使用passwordgrant_type创建一个获取access_token的新调用。
在我的例子中,我POST到{{url}}/access_token。与此调用一起发送的是在Body选项卡中指定的作为form-data键/值对的以下信息:

  • 一个月十二个月一个月:一个月十三个月一个月
  • 一个月十四个月一个月:一个月十五个月一个月
  • 一个月十六个月一个月:一个月十七个月一个月
  • 一个月十八个月一个月:一个月十九个月一个月
  • 一个月20日一个月:一个月21日一个月

发送此POST将导致类似以下的响应:

{
  "access_token": "kciOMpcmRcGTKfoo",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "DMGAe2TGaFbar"
}

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

var data = JSON.parse(responseBody);
postman.setEnvironmentVariable("access_token", data.access_token);
postman.setEnvironmentVariable("refresh_token", data.refresh_token);

注意:我还在这里做了一个测试,只是为了确保至少这个调用也能正常工作,尽管这与最初的问题无关:

var jsonData = JSON.parse(responseBody);
tests["token_type is Bearer"] = jsonData.token_type === "Bearer";

现在,我创建的任何新调用都可以使用第一次调用生成的access_token作为环境变量,如下所示:{{access_token}}。在我的例子中,我在调用/测试中转到Headers选项卡,并添加以下键/对:

  • 一个月二十六个月一个月:一个月二十七个月一个月

加分:这里我没有给出一个例子,但是理论上我可以添加一个pre-request脚本来测试当前的(非空)access_token和API,如果失败,使用给定的(非空)refresh_token获取一个新的,这样我就不必担心访问令牌过期。
总而言之,我不喜欢这个解决方案,因为它需要将第一个access_token调用添加到我的集合中的每个子文件夹,因为如果我只想运行子文件夹,而不是整个集合,我需要确保我有一个新的access_token。不这样做意味着当access_token过期时,所有测试都会失败。如果您从不在Collection Runner中单独运行子文件夹,您可以只创建一个access_token调用并将其设置为在集合中运行的第一个调用。
但是,由于这个原因,我还不打算将其标记为正确答案,我猜有一个比我提出的答案更好的答案-理想的答案是,我不必将相同的access_token调用/测试复制到每个子文件夹中,而是可以获得自动化、非交互式测试的好处,可以灵活地单独运行子文件夹或将集合作为一个整体运行。

tvokkenx

tvokkenx3#

首先,从线程中获取read this answer,现在,考虑问题的后半部分(基于注解):

    • 如何使用刷新标记?**

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

1.在主体中,删除usernamepassword。将grant_type替换为"refresh_token"。将refresh_token添加为值"{{refresh_token}}",该值是对您首次授权时创建的变量的引用(* 您是否记得read this answer?*)

1.确保刷新请求的Tests部分覆盖了access_token和refresh_token的Postman变量。为什么?因为无论何时执行刷新,都会获得另一个刷新令牌。如果不捕获新的刷新令牌,你最终会使用旧的刷新令牌,API会拒绝它,然后你需要从第一步开始重新运行整个过程(例如从this answer开始)。

1.现在,当您的授权过期时,您无需运行包含您的用户名和密码的原始请求。您可以使用我们刚刚创建的请求不断刷新。当您正在协作并需要共享API访问权限,但不想共享用户名/密码时,这一点特别有用。
啊!

bqujaahr

bqujaahr4#

其他两个答案都是正确的。但是,还有另一种方法可以完成此操作,并且不需要任何额外的请求。此方法使用需要access_token的请求的pre-request脚本。您可以使用postman-sandbox-api中记录的pm.sendRequest
在预请求脚本中,只需向auth-token URL发送一个请求,发送所有凭据和刷新令牌,在响应中您将获得访问令牌,然后您可以将其保存在环境中或内存中,然后使用它。

// Set all these variables in an environment or at collection level
let tokenUrl = pm.variables.get('tokenUrl'),
    clientId = pm.variables.get('clientId'),
    clientSecret = pm.variables.get('clientSecret'),
    refreshToken = pm.variables.get('refreshToken'),
    requestOptions = {
      method: 'POST',
      url: tokenUrl,
      body: {
        mode: 'formdata',
        formdata: [
            {
                key: 'grant_type',
                value: 'refresh_token'
            },
            {
                key: 'client_id',
                value: clientId
            },
            {
                key: 'client_secret',
                value: clientSecret
            },
            {
                key: 'refresh_token',
                value: refreshToken
            }
        ]
      }
    };

console.log({ requestOptions });

pm.sendRequest(requestOptions, (err, response) => {
  let jsonResponse = response.json(),
      newAccessToken = jsonResponse.access_token;

  console.log({ err, jsonResponse, newAccessToken })

  // If you want to persist the token
  pm.environment.set('accessToken', newAccessToken);

  // Or if you just want to use this in the current request and then discard it
  pm.variables.set('accessToken', newAccessToken);
});

现在,当发送请求时,变量accessToken将出现,您可以在请求中使用它,如下所示:

注:Oauth2中有4种类型的授权类型。其中两种(Auth code & Implicit)需要与浏览器交互,这是不能自动实现的。但是如果服务器提供refresh-token,那么上面的脚本可以帮助你获得访问令牌。其他两种类型(客户端凭据和密码凭据)不需要任何浏览器交互。因此,这些都可以从脚本自动化。如果您使用client_凭据,您可以调整上述脚本,从authUrl获取code,然后从AuthTokenUrl获取access_token

polhcujo

polhcujo5#

从v10.6.0开始,Postman授权处理OAuth2令牌的自动续订。下面是一个视频教程:

https://www.youtube.com/watch?v=FAhs9TBK-xU

相关问题