使用带有passport-azure-ad的state / customState

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

我无法弄清楚customState的目的以及是否/如何利用它将数据传递给返回网址。具体来说,我希望在登录后将用户路由回原来的位置。我想我可以将原始网址传递给参数customState并让它在返回网址POST中返回给我,但它似乎是编码的或者可能替换为不同的值。

这是我想要实现的目标:

  1. 匿名用户访问需要身份验证的/page/protected
  2. 代码调用passport.authenticate,后者又重定向用户登录。
  3. 用户登录并返回到预先配置的返回URL,例如:/auth/oidc/return
  4. 代码处理从表单发布数据中提取信息。
  5. 用户被引导回/page/protected
node.js openid-connect adal azure-ad-b2c passport-azure-ad
1个回答
2
投票

返回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”参数值应加密,这意味着如果您不希望返回URL被篡改,则必须解密req.body.state参数。

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

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