Не удалось получить токен доступа из кода авторизации для приложения Azure - PullRequest
1 голос
/ 28 февраля 2020

Я делаю SSO для Azure AD для моего приложения Azure, использующего библиотеку passport- azure -ad. Ниже приведен объект параметров:

const options = {
    identityMetadata: process.env.AZUREAD_IDENTITY_METADATA,
    clientID: process.env.AZUREAD_AUTH_CLIENT_ID,
    responseType: 'code id_token',
    responseMode: 'form_post',
    redirectUrl: process.env.AZUREAD_REDIRECT_URL,
    allowHttpForRedirectUrl: true,
    clientSecret: process.env.AZUREAD_AUTH_CLIENT_SECRET,
    validateIssuer: false,
    issuer: null,
    passReqToCallback: true,
    useCookieInsteadOfSession: true,
    cookieEncryptionKeys: [
        { key: '********************************', iv: '************' },
        { key: '********************************', iv: '************' },
    ],
    scope: ['profile', 'offline_access', 'https://graph.microsoft.com/mail.read'],
    loggingLevel: 'info',
    nonceLifetime: null,
    nonceMaxAmount: 5,
    clockSkew: null,
};

После получения кода авторизации (req.body.code) из обратного вызова AD я использую его для получения токена доступа для моего приложения с помощью библиотеки adal-node. Соответствующий фрагмент кода -

const authenticationContext = new AuthenticationContext(
            `https://login.microsoftonline.com/<tenant>.onmicrosoft.com`,
        );
        authenticationContext.acquireTokenWithAuthorizationCode(
            req.body.code,
            process.env.AZUREAD_REDIRECT_URL,
            process.env.AZUREAD_AUTH_CLIENT_ID,
            process.env.AZUREAD_AUTH_CLIENT_ID,
            process.env.AZUREAD_AUTH_CLIENT_SECRET,
            function(err, response) {
                let message = '';
                if (err) {
                    message = 'error: ' + err.message + '\n';
                }
                message += 'response: ' + JSON.stringify(response);

                if (err) {
                    console.log(message);
                    return;
                }
...

Но этот метод приводит к следующей ошибке:

"error": "invalid_grant",
    "error_description": "AADSTS54005: OAuth2 Authorization code was already redeemed, please retry with a new valid code or use an existing refresh token.\r\nTrace ID: 539cdaf3-460d-43fa-b4bb-6f23a8058800\r\nCorrelation ID: 507aafd9-5a4a-4417-b1f8-9fe4a5bc4cd3\r\nTimestamp: 2020-02-28 13:10:27Z",
    "error_codes": [
        54005
    ],

Также попытался получить токен доступа на основе документации (https://docs.microsoft.com/en-us/azure/active-directory/azuread-dev/v1-protocols-oauth-code#use -the-authorization -code-to-request-an-access-token ) с использованием Postman, но это также приводит к той же ошибке.

Пожалуйста, помогите мне разобраться в этой ошибке.

1 Ответ

0 голосов
/ 02 марта 2020

Azure AD больше не будет принимать коды авторизации для выдачи токенов, которые уже были использованы.

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

Ссылка:

https://social.msdn.microsoft.com/Forums/en-US/4192e141-309a-4dd6-a5c9-f1a8ce32f4ca/aadsts54005-oauth2-authorization-code-was-already-redeemed

...