我正在使用retrofit 2.0在Android上构建Bitbucket REST客户端 .
就我而言,OAUTH2.0提供“隐式授权”,当用户在提示时登录到他们的帐户时,它立即为客户端提供访问承载令牌 .
承载令牌是可用于访问受保护资源的令牌 . 拥有承载令牌的任何人都有权访问受保护资源,就像拥有承载令牌的任何其他人一样 . (根据IETF的this doc)
如果我错了请纠正我,但我想使用隐式授权,用户登录他们的Bitbucket帐户后,我将获得Bearer访问令牌 . 之后,我可以使用此访问令牌访问Bitbucket上的受保护资源(如创建新的存储库) .
所以我使用了Bitbucket doc中描述的OAUTH2.0隐式授权构建了我的android . 请注意,他们描述的响应会有 #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
My first question: 上述响应的Bearer访问令牌究竟是什么?
部分 lEuvneW39onVrnNR-jvZfirI43fwi5Wdc0YaaMROBk5YKJsd2ulXm20vJDdOBjf8I-Ne2r2vC8-_FHECSLw
是承载访问令牌吗?我是否必须包含"%3D"(以ASCII编码的char "=")? Bitbucket doc是不是意味着除了最后"&token_type=bear"之外的所有内容都是Bear访问令牌?
那不是全部 . Bitbucket doc提出的请求如下:
在请求标头中发送:授权:Bearer
所以我将此请求设置为根据API of Bitbucket创建一个新的存储库:
@POST("repositories/{username}/{repo_slug}")
Call<Repository> createRepository(
@Header("Authorization") String auth,
@Path("username") String userName,
@Path("repo_slug") String repoSlug);
但每次,我得到状态代码为401的响应和消息错误:
访问令牌已过期 . 使用刷新令牌获取新的访问令牌 .
当我尝试使用Restlet的DHC(像Postman这样的Chrome扩展)发布相同的请求时,会出现一个弹出窗口并要求我登录Bitbucket . 如果我拒绝这样做,我得到了同样的错误401响应 . 如果我登录,那么它的工作原理 .
My second question: 为什么我必须再次提供我的凭据?
我认为's something wrong here. I thought with the Bearer access token, I should be able to access the protected resource without having to log in before the access token'已达到过期时间 . 为什么我必须第二次输入我的凭证?这不是IETF在"Implicit grant"方法here中描述的内容 .
1 回答
access_token的值在
access_token=
之后开始,并在&scopes=
之前的下一个参数scopes
之前结束 . 片段部分的格式在https://tools.ietf.org/html/rfc6749#section-4.2.2中指定,后者指向https://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#h-17.13.4.1,其中说:因此,您按规范访问令牌值是
lEuvneW39onVrnNR-jvZfirI43fwi5Wdc0YaaMROBk5YKJsd2ulXm20vJDdOBjf8I-Ne2r2vC8-_FHECSLw%3D
但我同意结尾%3D
是可疑的,并且可能是发件人的错误 .如果您的访问令牌已过期(这似乎是它),您需要再次使用隐式授权或使用刷新令牌授予来获取新访问令牌 .