3

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

这是我想要实现的目标:

  1. /page/protected需要身份验证的匿名用户访问。
  2. 代码调用passport.authenticate反过来将用户重定向到登录。
  3. 用户登录并返回到预先配置的返回 url,例如:/auth/oidc/return.
  4. 代码处理从表单发布数据中提取信息。
  5. 用户被引导回/page/protected
4

1 回答 1

4

返回 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)req.body.state认证中间件验证来自Azure AD B2C的认证响应后获取参数:

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如果您不希望返回 URL 被篡改,则必须解密该参数。

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

于 2017-12-14T22:07:51.280 回答