从Azure获取令牌以访问Microsoft Graph后无法调用函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Azure获取令牌以访问Microsoft Graph后无法调用函数相关的知识,希望对你有一定的参考价值。

我正在编写一个Azure函数,它从Microsoft获取OAuth令牌,这是我能够成功获得的。我正在尝试使用该令牌访问Microsoft Graph。我收到来自Microsoft的令牌后,我的功能在十分钟后超时并且没有超过context.log('CALLING MS GRAPH'.)我是Azure的新手,并且无法弄清楚为什么我不能使用值来调用我的第二个函数从Microsoft返回的令牌或具有硬编码值的令牌。

任何帮助是极大的赞赏 :)

我已经尝试将令牌值硬编码到函数中,更改超时,并添加各种context.log() - 但无法接收令牌。我也试过删除.end()到我的POST调用。

const https = require('https');
const querystring = require('querystring');

getAccessToken = (context, callback) => {
    const postData = querystring.stringify({
        'client_id': {clientID},
        'scope': 'https://graph.microsoft.com/.default',
        'client_secret': {clientSecret},
        'grant_type': 'client_credentials'
    });

      const msTokenOptions = {
        hostname: 'login.microsoftonline.com',
        port: 443,
        path: `/${tenantID}}/oauth2/v2.0/token`,
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': postData.length
        }
    };

    const oauthReq = https.request(msTokenOptions, (res) => {
        res.setEncoding('utf8');

        res.on('data', (d) => {
            let accessToken = JSON.parse(d).access_token;

            // Error happens here.  
            context.log('CALLING MSGRAPH')

            // I never make it into the functions below, regardless of how they're called. 
           callback(accessToken);
            accessMsGraph(accessToken)
        });
    });

    oauthReq.on('error', (e) => {
        context.log('ERROR: Problem obtaining MS Token. ' + e);
    });

    oauthReq.write(postData);
    oauthReq.end();

    return;
};

accessMsGraph = (token) => {
    // GET request to MS Graph here - I never make it into this function.

};


module.exports = (context, req) => {
    getAccessToken(context, (token) => {
        context.log('Accessing graph')
        accessMsGraph(context, token)
        accessMsGraph('123456')
    });
};


答案

请检查租户中设置的访问令牌生命周期。

这实际上不是由Microsoft Graph确定,而是由Azure Active Directory确定。对于给定的租户,可以使用Configurable token lifetimes in Azure Active Directory (Public Preview)配置生命周期。

此功能仍在预览中,因此功能可能会在现在和一般版本之间发生变化。

此配置是每个租户,服务主体或应用程序。如果在应用程序上对其进行配置,则该策略将应用于多租户应用程序,除非被服务主体或租户级别的策略取代。

Access令牌的最长生命周期为24小时(最短为10分钟,默认为1小时)。

通常,您应该依赖于刷新令牌,而不是调整访问令牌的生命周期。它们的寿命更长,为14天。

刷新令牌

当客户端获取访问令牌以访问受保护资源时,客户端也会收到刷新令牌。刷新令牌用于在当前访问令牌到期时获取新的访问/刷新令牌对。刷新令牌绑定到用户和客户端的组合。可以随时撤消刷新令牌,并且每次使用令牌时都会检查令牌的有效性。用于获取新访问令牌时,刷新令牌不会被撤销 - 但最佳做法是在获取新令牌时安全删除旧令牌。

以上是关于从Azure获取令牌以访问Microsoft Graph后无法调用函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 microsoft azure 用户的情况下使用 swift 获取访问令牌?

从 Azure Active Directory 验证 JWT

Azure 条件访问不适用于令牌获取请求?

如何使用 asp.net mvc 从 azure 获取访问令牌

从 Powershell 获取 Azure Active Directory 访问令牌

从 URL Azure AD 捕获访问令牌以用于令牌