刷新 Microsoft Live API 的 OAuth 访问令牌

6

目前,我通过在Web视图中向以下URL发送请求,要求用户登录Microsoft Live:

https://login.live.com/oauth20_authorize.srf?client_id=[CLIENT ID]&scope=[SCOPES]&response_type=token&redirect_uri=[REDIRECT URI]&display=popup

这个很完美,我收到并保存了access_tokenauthentication_token。请注意,即使我包括wl.offline_access作用域,它也不会返回refresh_token
当访问令牌过期并需要刷新时,问题就出现了。我正在尝试使用Microsoft文档中的方法来刷新令牌:
https://login.live.com/oauth20_token.srf?client_id=[CLIENT ID]&redirect_uri=[REDIRECT URI]&client_secret=[CLIENT SECRET]&refresh_token=[WHAT TO PUT HERE?]&grant_type=refresh_token

然而,在登录过程中未返回refresh_token,因此我不知道该传入什么。请注意,将authentication_token(它应该用于什么?)作为refresh_token参数发送会导致以下结果:
{
  "error": "invalid_grant",
  "error_description": "The provided value for the input parameter 'refresh_token' is not valid."
}

有人知道如何通过Microsoft Live的REST API正确地刷新令牌吗?


你弄清楚怎么获取刷新令牌了吗? - user2924482
1个回答

10

在进一步阅读了微软的文档并进行实验后,我成功地找出了如何做到这一点。

我最初尝试的问题是,当我使用隐式授权流程时请求wl.offline_access范围,而他们的文档中说不要这样做:

注意:如果你正在使用隐式授权流程(response_type=token),请不要包括wl.offline_access范围。

因此,我将我的URL更改为以下内容(使用授权码授权流程,因为我需要离线访问):

https://login.live.com/oauth20_authorize.srf?client_id=[CLIENT ID]&scope=[SCOPES]&response_type=code&redirect_uri=[REDIRECT URI]&display=popup

然后,一旦我在回调函数中收到了code,我调用以下端点来检索访问令牌和刷新令牌:

Translated:

然后,一旦我在回调函数中收到了code,我调用以下端点来检索访问令牌和刷新令牌:

https://login.live.com/oauth20_token.srf?client_id=[CLIENT ID]&redirect_uri=[REDIRECT URI]&client_secret=[CLIENT SECRET]&code=[CODE FROM AUTHORIZATION]&grant_type=authorization_code

注意:微软文档中关于上述链接的端点是有误的。这是一个 GET 请求,而不是他们文档所声称的 POST 请求。

最终该方法返回了 access_tokenrefresh_token 参数,我成功地使用了这两个参数。


那么你用来从OneDrive调用数据的URL是什么?我使用了https://api.onedrive.com/v1.0/drive,带有Authorization: bearer {token}。但它返回“身份验证失败”。 - Ravindu
1
这对我不起作用。如果我进行GET请求,我会收到以下错误:“error_description”:“提供的请求必须具有内容类型'application/x-www-form-urlencoded'。” - user2924482
听起来你应该将Content-Type头设置为application/x-www-form-urlencoded,@user2924482 :) - rebello95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接