我能够从后端API中检索on_behalf_of令牌以在页面中使用客户端,但是如果我对Microsoft Graph进行了两次调用,一次又一次,第二次调用总是失败,并显示401未经授权。通话是一个接一个的,因此肯定在到期时间窗口内。该令牌是一次性使用的(即使用后立即失效),还是我做错了什么?
我的代码基于this sample,但我将其扩展为立即再次调用图,如下所示:
function useServerSideTokenAgain(token) {
display("4. Call https://graph.microsoft.com/v1.0/me/messages with the server side token");
return fetch("https://graph.microsoft.com/v1.0/me/messages?$select=sender,subject",
{
method: 'GET',
headers: {
"accept": "application/json",
"authorization": "bearer " + token
},
mode: 'cors',
cache: 'default'
})
.then((response) => {
if (response.ok) {
return response.json();
} else {
throw (`Error ${response.status}: ${response.statusText}`);
}
})
.then((profile) => {
display(JSON.stringify(profile, undefined, 4), 'pre');
});
}
然后,我将原始代码更改为
getClientSideToken()
.then((clientSideToken) => {
return getServerSideToken(clientSideToken);
})
.then((serverSideToken) => {
return useServerSideToken(serverSideToken);
})
.catch((error) => {
...
对此:
getClientSideToken()
.then((clientSideToken) => {
return getServerSideToken(clientSideToken);
})
.then((serverSideToken) => {
return useServerSideToken(serverSideToken);
})
.then((serverSideToken) => {
return useServerSideTokenAgain(serverSideToken);
})
.catch((error) => {
...
我的应用已委派了“ Mail.Read”权限,因此该操作本身可以正常工作。顺便说一句,如果我更改操作顺序,则相反的事情也会发生(步骤4正常,但是步骤3抛出未经授权的401):
getClientSideToken()
...
.then((serverSideToken) => {
return useServerSideTokenAgain(serverSideToken);
})
.then((serverSideToken) => {
return useServerSideToken(serverSideToken);
})
.catch((error) => {
...