Microsoft Graph代表令牌-仅是一次使用吗?

时间:2020-09-09 14:20:44

标签: microsoft-graph-api

我能够从后端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) => {
                ...

0 个答案:

没有答案