无法从Azure应用的授权代码中检索访问令牌

问题描述 投票:0回答:1

我正在使用passport-azure-ad库为我的Azure应用程序对Azure AD执行SSO。以下是options对象:

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,
};

从AD回调获取授权码(req.body.code)之后,我正在使用它通过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)检索访问令牌,但这也会导致相同的错误。

请帮助我找出此处的错误。

node.js access-token adal passport-azure-ad
1个回答
0
投票

Azure AD将不再接受授权代码来发布已使用的令牌。

您每次都需要获取新的授权码。另外,您可以更改代码以请求刷新令牌,该刷新令牌将传递给其他资源/由其他资源使用,因为刷新令牌仍可以重复使用。

参考:

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

© www.soinside.com 2019 - 2024. All rights reserved.