为什么我对新访问令牌的请求没有返回新的刷新令牌?

时间:2016-01-26 01:30:24

标签: node.js office365api microsoft-graph

我使用以下代码和我的刷新令牌来请求新的访问令牌:

exports.getTokenFromRefreshToken = function (user, callback) {
    request.post({
        url:'https://login.microsoftonline.com/12345678-1234-1234-1234-2f189712345/oauth2/token',
        form: {
            grant_type: 'refresh_token',
            refresh_token: refresh_token,
            client_id: client_id,
            client_secret: client_secret,
            resource: 'https://graph.microsoft.com'
        }
    }, function(err, httpResponse, body) {
        if (!err) {
            var tokens = JSON.parse(httpResponse.body);
            console.log('getTokenFromRefreshToken() tokens = ' + JSON.stringify(tokens));
            callback(null, tokens);
        }
    })
};

httpResponse包含我在发出原始令牌请求时(从code)获得的所有内容,但没有新的刷新令牌。我的印象是我还会收到一个新的刷新令牌。那不是这样吗?

4 个答案:

答案 0 :(得分:3)

只有在包含offline_access范围时才会获得新的刷新令牌。

参考:https://azure.microsoft.com/en-us/documentation/articles/active-directory-v2-scopes/

  

offline_access范围可让您的应用代表用户长时间访问资源。在工作帐户同意页面上,此范围显示为"随时访问您的数据"允许。在个人Microsoft帐户同意页面上,它显示为"随时访问您的信息"允许。 当用户批准offline_access范围时,您的应用可以从v2.0令牌端点接收刷新令牌。刷新令牌是长寿的。随着旧应用程序的到期,您的应用可以获得新的访问权限。

答案 1 :(得分:0)

刷新令牌不会像使用刷新令牌获取新访问令牌一样刷新。刷新令牌到期时,您需要获取凭据并再次执行初始令牌获取。

此处有更多信息:Refreshing an Access Token

答案 2 :(得分:0)

看起来它应该可以工作,除了你似乎缺少重定向URI。我有一个这个调用的工作版本,但它包含这个redirect_uri。它为我生成了一个新的访问和刷新令牌。

-

http://graph.microsoft.io/en-us/docs/authorization/app_authorization

使用刷新令牌续订过期的访问令牌

验证完成后浏览器发送到的重定向URL。这应与第一个请求中使用的redirect_uri值匹配。

答案 3 :(得分:0)

我遇到了完全相同的问题,在发现问题之前引起了一段时间的头痛。

好像您可能正在使用来宾MS帐户(以前称为Live)登录,因此获得12小时到期刷新令牌而没有滚动窗口。

您需要使用完整的MS帐户在响应正文中返回刷新令牌(这是一个将持续14天的令牌),滚动窗口为90天。

只要您使用来宾MSA,您就不会获得刷新令牌。据我所知,您的代码结构正确,我认为您不需要如上所述的redirect_uri标题,根据doco,它们是可选字段。

有关刷新令牌类型的更多信息,请参阅此博客文章:

Azure tokens