【问题标题】:Passport azure-ad Verify Callback not CalledPassport azure-ad 验证未调用回调
【发布时间】:2018-07-25 05:40:07
【问题描述】:

我在使用 passport(使用 passport-azure-ad 策略)对请求进行身份验证时遇到了问题。 对 Azure Active Directory 的请求工作正常。我可以使用我的凭据登录。之后,我希望调用验证回调,根据 accessToken 等设置用户对象。然后我希望在用户对象可用的地方调用重定向路由函数。 这是我的设置:

passport.serializeUser((accessToken, done) => {
    done(null, accessToken);
});

passport.deserializeUser((accessToken, done) => {
    done(null, accessToken);
});

passport.use(new OIDCStrategy({
    // options for the azure AD strategy
    identityMetadata: config.auth.identityMetadata,
    clientID: config.auth.clientID,
    clientSecret: config.auth.clientSecret,
    redirectUrl: config.auth.redirectUrl,
    responseType: 'code id_token',
    responseMode: 'query',
    allowHttpForRedirectUrl: config.auth.allowHttpForRedirectUrl,
    isB2C: true,
    passReqToCallback: false,
    scope: config.auth.scope,
    loggingLevel: 'error'
}, (iss, sub, profile, jwtClaims, accessToken, refreshToken, params, done) => {
    console.log('1. VERIFY CALLBACK');
    if (!accessToken) {
        return done(new Error('No accessToken was given'), null);
    }
    return done(null, { accessToken, expires: params.expires_on, refreshToken });
}));

我的路线:

router.get('/auth/login', (req, res, next) => {
    passport.authenticate('azuread-openidconnect', { failureRedirect: '/' })(req, res, next);
});

router.get('/auth/openid/redirect', (req, res, next) => {
    passport.authenticate('azuread-openidconnect', { failureRedirect: '/' }, (err, user) => {
        console.log('2. ROUTE REDIRECT');
        return res.send('...then redirect existing user to profile page');
    })(req, res, next);
});

10 次中有 2 次,我的期望是正确的,一切正常。其余时间从不调用验证回调,或者在它之前调用重定向路由函数,因此从不设置用户对象(用户为“假”)。

有人知道我该如何度过这个难关吗?

【问题讨论】:

    标签: javascript node.js express passport.js passport-azure-ad


    【解决方案1】:

    据我了解,passport-azure-ad 身份验证流程如下:

    1. 用户导航到 /auth/login 路径
    2. 用户按照屏幕上的说明使用 Azure Active Directory (AAD) 上配置的应用程序进行身份验证
    3. 身份验证成功后。调用特定应用程序的 replyURL。在你的情况下 /auth/openid/redirect。
    4. 回复 URL 接收来自 AAD 的 HTTP 发布请求,其中包含身份验证(令牌等)的详细信息,正文为 urlEncoded
    5. 然后调用 Passport 策略并执行回调函数以在您的应用程序中验证用户身份

    我遇到了与您类似的问题,我可以使用 azure 登录,然后会调用 replyURL,但是我的浏览器会进入调用 replyURL 的无限循环,并且永远不会启动策略验证回调。

    我设法确定我没有配置我的 express 服务器来正确解析 urlEncoded 正文,这导致了以下代码行的无限循环...

    app.use(bodyParser.urlencoded({ extended : true }));
    

    我怀疑你可能有同样的问题。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-08-10
      • 2016-11-11
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 2014-09-01
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多