当前位置: 首页 > 知识库问答 >
问题:

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

卫弘义
2023-03-14

目标

能够运行集合,而无需在运行集合之前逐个完成每个调用的授权过程。

我所尝试/注意到的

>

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

    我尝试在集合开始时创建几个步骤来复制助手,但无法通过需要用户交互来批准/拒绝的步骤(这是有道理的,因为否则会带来安全风险)。但是,我似乎也不知道如何像OAuth2助手那样提示用户。

    我已经降低了对刷新令牌的期望,并认为我可以简单地在列表中的第一个测试上运行身份验证,以某种方式将访问令牌保存在全局或环境变量中,然后在所有后续测试中使用该令牌,但我还没有找到保存通过OAuth2助手生成的访问令牌的方法。

    我很想知道是否有一个解决方案可以使集合在授权上花费最少的努力就可以运行。随着集合中编写的更多测试都使用OAuth2授权,这变得更加重要。

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

  • 共有3个答案

    东郭鸿福
    2023-03-14

    首先,从帖子中阅读这个答案。现在,将其视为问题的后半部分(基于评论):

    如何使用刷新令牌?

    1. 创建新的 POST 请求(最简单的方法是复制您为获取access_token而创建的请求)。

    哈!

    郎思远
    2023-03-14

    我在github上找到了答案。

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

    • 网址 : (您的 API endpoint)
    • access_token : (空白)
    • refresh_token : (空白)
    • client_id : (您的client_id)
    • client_secret : (您的client_secret)
    • 用户名 : (您的用户名)
    • 密码 :(您的密码)

    接下来,创建一个新调用,使用密码grant_type获取access_token

    在我的例子中,我POST到{{url}}/access_token。与此调用一起发送的是以下信息,即Body选项卡中指定的form-data键/值对:

    • grant_type密码
    • 用户名{{用户名}}
    • 密码{{密码}}
    • client_id{{client_id}}
    • client_secret{{client_secret}}

    发送此POST将导致如下响应:

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

    然后,在Tests选项卡中,我添加了以下代码来分配两个环境变量,< code>access_token和< code>refresh_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_tken}}

    • 授权Bearer{{access_token}}

    优点:我在这里没有给出一个例子,但从理论上讲,我可以添加一个预请求脚本,用于针对API测试当前(非空白)access_token,如果失败,请使用给定的(非空白)refresh_token获取一个新脚本。这将使我不必担心访问令牌过期。

    总而言之,我不喜欢这个解决方案,因为它需要将第一个access_token调用添加到我的收藏中的每个子文件夹,因为如果我想只运行一个子文件夹而不是整个收藏,我需要确保我有一个新的access_token。如果不这样做,则意味着当access_token过期时,所有测试都将失败。如果您从未在集合运行器中单独运行子文件夹,则可以只创建一个access_token调用并将其设置为集合中要运行的第一个调用。

    但是,由于这个原因,我还不打算把它标为正确答案。我猜想有一个比我想出的更好的答案——理想的答案是,我不必在每个子文件夹中复制相同的access_token调用/测试,但可以获得自动化、非交互式测试的好处,可以灵活地单独运行子文件夹或整个集合。

    徐星阑
    2023-03-14

    好的,首先输入您的OAUTH令牌URL,单击Body选项卡,并填写这些POST参数:client_id、grant_type、用户名、密码、覆盖。

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

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

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

    瞧!

     类似资料:
    • 我对oauth2中的刷新令牌有点困惑。如它所说的访问令牌限制了黑客可以使用用户凭证的1小时的时间窗口,刷新令牌是万岁令牌,可以用来重新创建访问令牌。 我很困惑,如果有人从cookie中窃取了访问令牌,他也可以窃取刷新令牌,并可以使用刷新令牌创建新的访问令牌,因为我在JQuery中有ajax请求(客户端)

    • 我正在实现一个支持刷新令牌的OAuth2服务器,但是,有一些东西我不能完全理解。 当用户通过请求新的访问令牌,并且他/她请求的范围小于原始访问令牌的范围(5个范围中的3个)时。刷新令牌应该具有原始作用域还是刷新令牌应该具有请求的新作用域? > 如果刷新令牌请求了新的作用域,这是否意味着如果它们继续请求较小的作用域,它们最终将耗尽作用域? 刷新令牌是否应保留原始作用域?这意味着返回的访问令牌对于刷新

    • 下面的代码使用Google oauth2机制登录用户。我们需要在用户离线时处理用户日历的更新,所以我们最终需要“刷新令牌”。grantOfflineAccess()的结果是否返回刷新令牌(在下面,我可以看到response.code包含一个可能是刷新令牌的值)? 我如何获得一个刷新令牌,可以用来(服务器端)创建新的访问键,以便离线访问用户的谷歌日历?

    • 请求你分享你的想法。 提前道谢。

    • 我使用docusign身份验证流作为 登录时 让url=”https://account-d.docusign.com/oauth/auth?response_type=token 窗打开(url,“U self”);成功验证后,返回/token\u type/state中的access\u token/expires\u。 请指导如何refresh_token?refresh_token如何获得

    • 我理解客户机应用程序使用refresh_token(连同它的凭据)为最终用户(资源所有者)获取新的访问令牌,而不是存储最终用户的用户名/密码,并在每次access_token过期时发送它们。 然而,在我看来,这听起来像refresh_token和access_token一样好,它几乎只是一个额外的服务器调用,所以为什么不直接使用它,即如果refresh token是有效的授予访问权限呢?