我有一个可以访问用户日历的移动应用程序(Microsoft)。获得访问令牌后,我将其保存在后端数据库中以供重用。然后我 - 单独 - 从node.js API调用Microsoft Graph API,保存的令牌工作正常:
var microsoftGraph = require("@microsoft/microsoft-graph-client");
var client = microsoftGraph.Client.init({
authProvider: (done) => {
done(null, token);
}
});
client.api('/me/calendar/events/xyz').patch({
'Body': {
'ContentType': '0',
'Content': 'test from api 2'
}
}, (err, res) => {
if (err) {
console.log('err: ', err);
} else {
console.log('res: ', res);
}
});
问题是令牌过期,并且没有刷新令牌,无需用户干预即可从服务器续订。
以下是我在2小时后得到的错误:
err: {
statusCode: 401,
code: 'InvalidAuthenticationToken',
message: 'CompactToken validation failed with reason code: -2147184088.',
requestId: '5bdd2402-b1b9-4c25-8b2d-1ca2c4a79192',
date: 2017 - 08 - 07 T19: 27: 44.000 Z,
body: {
code: 'InvalidAuthenticationToken',
message: 'CompactToken validation failed with reason code: -2147184088.',
innerError: {
'request-id': '5bdd2402-b1b9-4c25-8b2d-1ca2c4a79192',
date: '2017-08-07T15:27:44'
}
}
}
我在这里缺少什么?必须有一种方法可以将服务器端代码与Microsoft Graph集成,而无需从客户端更新令牌吗?
答案 0 :(得分:3)
访问令牌在60分钟后过期,因此您需要获取新令牌或使用刷新令牌。刷新令牌可用于获取新的访问令牌,该API调用的文档位于此处:https://developer.microsoft.com/en-us/graph/docs/concepts/auth_v2_user#5-use-the-refresh-token-to-get-a-new-access-token
要获取刷新令牌,请求offline_access
权限,用户将在同意屏幕中将此视为“随时访问您的数据”。可以在此处找到请求offline_access
范围的示例:https://developer.microsoft.com/en-us/graph/docs/concepts/auth_v2_user#2-get-authorization