5

我在使用护照(使用 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 次,我的期望是正确的,一切正常。其余时间从不调用验证回调,或者在它之前调用重定向路由函数,因此从不设置用户对象(用户为“假”)。

任何人都知道我该如何度过这个难关?

4

1 回答 1

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 的无限循环,并且永远不会启动策略验证回调。

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

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

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

希望有帮助。

于 2019-05-24T05:43:31.420 回答