我使用以下代码和我的刷新令牌来请求新的访问令牌:
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
)获得的所有内容,但没有新的刷新令牌。我的印象是我还会收到一个新的刷新令牌。那不是这样吗?
答案 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,它们是可选字段。
有关刷新令牌类型的更多信息,请参阅此博客文章: