Невозможно вызвать функцию после возврата токена из Azure для доступа к Microsoft Graph

#javascript #node.js #azure

#javascript #node.js #azure

Вопрос:

Я пишу функцию Azure, которая принимает токен OAuth от Microsoft, который я смог успешно получить. Я пытаюсь использовать этот токен для доступа к 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')
    });
};


  

Ответ №1:

Пожалуйста, проверьте срок службы токена доступа, который был установлен в вашем клиенте.

На самом деле это определяется не Microsoft Graph, а Azure Active Directory.Для данного клиента время жизни можно настроить с помощью настраиваемых времен жизни токена в Azure Active Directory (общедоступный предварительный просмотр).

Эта функциональность все еще находится в предварительном просмотре, поэтому функциональность может измениться между текущим моментом и общим выпуском.

Эта конфигурация для каждого клиента, участника службы или приложения. Если вы настроите его в приложении, политика будет применяться к многопользовательским приложениям, если она не будет заменена политикой на уровне участника службы или клиента.

Максимальное время жизни токена доступа составляет 24 часа (минимум 10 минут, по умолчанию — 1 час).

В общем, вместо того, чтобы регулировать время жизни токена доступа, вы должны полагаться на токен обновления. У них гораздо более длительный срок службы — 14 дней.

Обновить токен

Когда клиент получает токен доступа для доступа к защищенному ресурсу, клиент также получает токен обновления. Токен обновления используется для получения новых пар токенов доступа / обновления по истечении срока действия текущего токена доступа. Токен обновления привязан к комбинации пользователя и клиента. Токен обновления может быть отозван в любое время, и действительность токена проверяется при каждом использовании токена. Токены обновления не отменяются при использовании для извлечения новых токенов доступа — однако рекомендуется безопасно удалять старый токен при получении нового.