Passport azure-ad验证未调用回叫

时间:2018-02-14 15:29:28

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

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

任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

据我了解,passport-azure-ad身份验证过程的工作方式如下:

  1. 用户导航到/ auth /登录路线
  2. 用户按照屏幕上的说明使用Azure Active Directory(AAD)上配置的应用程序进行身份验证
  3. 成功通过身份验证。您的特定应用程序的replyURL被调用。就您而言,/ auth / openid / redirect。
  4. 回复URL接收来自AAD的HTTP发布请求,并带有正文 urlEncoded
  5. 的身份验证(令牌等)详细信息
  6. 然后调用护照策略并执行回调函数以将用户验证到您的应用程序中

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

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

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

我怀疑您可能遇到了同样的问题。

希望有帮助。