使用 state/customState 和 passport-azure-ad

Utilizing state/customState with passport-azure-ad

我无法弄清楚 customState 和 if/how 的用途,我可以利用它向 return url 传递数据。具体来说,我希望在登录后将用户路由回他们原来的位置。我想我可以将原始 url 传递给参数 customState 并让它 returned 返回给我return url POST,但它似乎被编码或可能被不同的值替换。

这是我想要实现的目标:

  1. 匿名用户访问/page/protected需要认证
  2. 代码调用 passport.authenticate 进而重定向用户登录。
  3. 用户登录并return进入预先配置的 return url 例如:/auth/oidc/return.
  4. 代码处理从表单-post 数据中提取信息。
  5. 用户被引导回 /page/protected

A return URL(例如“/page/protected”)可以通过以下方式往返:

1) 在身份验证中间件重定向到 Azure AD B2C 之前设置 "customState" 参数:

app.get('/login', function (req, res, next) {
  passport.authenticate('azuread-openidconnect', {
    response: res,
    resourceURL: config.resourceURL,
    customState: '/page/protected', // Or set to the current URL
    failureRedirect: '/'
  })(req, res, next);
}, function (req, res) {
  res.redirect('/');
});

2) 在身份验证中间件验证来自 Azure AD B2C 的身份验证响应后获取 req.body.state 参数:

app.post('/auth/openid/return', function (req, res, next) {
  passport.authenticate('azuread-openidconnect', {
    response: res,
    failureRedirect: '/'
  })(req, res, next);
}, function (req, res) {
  res.redirect(req.body.state);
});

"customState" 参数值应该被加密,这意味着 req.body.state 参数必须被解密,如果你不想 return URL被篡改。

否则,通常在认证中间件重定向并向Azure AD B2C发送认证请求之前将return URL写入req.session,然后读取(然后在身份验证中间件收到并验证来自 Azure AD B2C 的身份验证响应后,从 req.session 中删除)此 return URL。