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

OAuth2.0承载令牌不工作

程成天
2023-03-14

我正在使用改型2.0在Android上构建一个Bitbucket REST客户端。

就我而言,OAuth2.0提供了“隐式授权”,当用户在提示下登录到他们的帐户时,它立即向客户机提供访问承载令牌。

承载令牌是可用于访问受保护资源的令牌。任何拥有承载令牌的人与其他拥有承载令牌的人一样,都有权访问受保护的资源。(根据IETF的这份文件)

如果我错了,请纠正我,但我认为使用隐式授权,在用户登录到他们的Bitbucket帐户后,我将拥有承载访问令牌。之后,我可以使用这个访问令牌访问Bitbucket上受保护的资源(比如创建一个新的存储库)。

因此,我使用OAuth2.0隐式授权构建了我的android,如Bitbucket文档中所述。注意,他们描述了响应将具有#access_token={token}&token_type=bearer

而这就是我登录后从Bitbucket上实际收到的:

your://redirecturi#access_token=lEuvneW39onVrnNR-jvZfirI43fwi5Wdc0YaaMROBk5YKJsd2ulXm20vJDdOBjf8I-Ne2r2vC8-_FHECSLw%3D&scopes=pipeline%3Awrite+webhook+snippet%3Awrite+wiki+issue%3Awrite+pullrequest%3Awrite+repository%3Adelete+repository%3Aadmin+project%3Awrite+team%3Awrite+account&expires_in=3600&token_type=bearer

我的第一个问题:从上面的响应来看,承载访问令牌到底是什么?

leuvnew39onvrnnr-jvzfiri43fwi5wdc0yaamrobk5ykjsd2ulxm20vjddobjf8i-ne2r2vc8-_fhecslw是承载访问令牌吗?我必须包含“%3D”(它是用ASCII编码的字符“=”)吗?Bitbucket doc不是意味着除了最后一个“&token_type=Bear”之外的所有东西都是Bear访问令牌吗?

还不止这些。Bitbucket Doc的指令如下:

因此,我根据Bitbucket的API设置了这个请求来创建一个新的存储库:

@POST("repositories/{username}/{repo_slug}")
    Call<Repository> createRepository(
            @Header("Authorization") String auth,
            @Path("username") String userName,
            @Path("repo_slug") String repoSlug);

但每次,我都得到状态代码401和消息错误的响应:

访问令牌过期。使用刷新令牌获取新的访问令牌。

当我试图通过Restlet(像邮递员一样的chrome扩展)使用DHC发布相同的请求时,会出现一个弹出窗口,并要求我登录到BitBucket。如果我拒绝这样做,我得到相同的错误401响应。如果我登录,那么它工作。

我的第二个问题:为什么我必须再次提供我的证件?

我想这里有点不对劲。我认为有了承载访问令牌,我应该能够访问受保护的资源,而不必在访问令牌到期之前登录。为什么我必须第二次输入我的凭据?这不是IETF在这里描述的“隐式授予”方法。

共有1个答案

仲孙超
2023-03-14

access_token的值开始于access_token=之后,结束于下一个参数scopesso before&scopes=之前。片段部分的格式化在https://tools.ietf.org/html/RFC6749#section-4.2.2中指定,该部分又指向https://www.w3.org/tr/1999/rec-html401-19991224/interace/forms.html#h-17.13.4.1,其中写道:

因此,您的访问令牌值按规范为leuvnew39onvrnnr-jvzfiri43fwi5wdc0yaamrobk5ykjsd2ulxm20vjddobjf8i-ne2r2vc8-_fhecslw%3d,但我同意结尾%3d是可疑的,可能是发件人的错误。

如果您的访问令牌过期(看起来就是这样),则需要再次使用隐式授权或使用刷新令牌授权来获得一个新令牌。

 类似资料:
  • 根据RFC6750-OAuth 2.0授权框架:承载令牌用法,承载令牌为: 一种具有财产的安全令牌,任何拥有令牌的一方(“持票人”)都可以以任何其他拥有令牌的一方可以使用的任何方式使用该令牌。 对我来说,这个定义是模糊的,我找不到任何规范。 假设我正在实现一个授权提供者,我可以为承载令牌提供任何类型的字符串吗? 它可能是随机字符串吗? 它必须是某些属性的base64编码吗? 是否应该对它进行哈希?

  • 在Postman中,我可以使用 回调URL Auth URL 客户端ID 我如何使用C#代码做同样的事情?

  • 我有一个zuul代理(http://localhost:8765)为angular web应用程序(http://localhost:8080/app)提供服务。在zuul代理后面还有一个oauth2服务器(http://localhost:8899)。 web资源在http://localhost:8765/web下代理,资源在http://localhost:8765/API下代理。Zuul代

  • 我在调用rest api时尝试使用承载令牌时遇到一些问题。 我尝试了两种方法,结果相同: 我在azure门户中创建了一个应用注册,并授予它使用devops api进行用户模拟的权限。 我在中创建了一个应用程序https://app.vsaex.visualstudio.com/并授予it项目/团队管理权限。 对于我的代码,我使用了这个(当我使用PAT进行身份验证时有效) 我使用以下示例获取令牌:h

  • 如何使用Live PayPal ClientID和密钥从PayPal https://api-M.PayPal.com/v1/oauth2/Token API调用中获得访问/承载令牌。 我在调用Postman中的API之前使用了下面的设置 基本Auth类型。主体tab=x-www-form-urlencoded。grant_type=client_credentials 我得到以下响应时调用以上A

  • 我在用阿斯匹林。网络应用程序 我很困惑。我已经使用JSON网络令牌。我明白这一点。已知经典的 JSON 网络令牌。标头、有效负载、签名、自包含。客户端可以查看索赔数据。 但是不记名令牌是什么呢?不记名令牌也是独立的。我们可以通过不记名令牌访问令牌的数据。客户端看不到索赔数据。 那我们为什么不使用不记名令牌呢?不记名代币不是标准吗?有没有像 JWT 持有者令牌这样的东西? 以及如何在 MVC Web