使用 state/customState 和 passport-azure-ad
Utilizing state/customState with passport-azure-ad
我无法弄清楚 customState
和 if/how 的用途,我可以利用它向 return url 传递数据。具体来说,我希望在登录后将用户路由回他们原来的位置。我想我可以将原始 url 传递给参数 customState
并让它 returned 返回给我return url POST
,但它似乎被编码或可能被不同的值替换。
这是我想要实现的目标:
- 匿名用户访问
/page/protected
需要认证
- 代码调用
passport.authenticate
进而重定向用户登录。
- 用户登录并return进入预先配置的 return url 例如:
/auth/oidc/return
.
- 代码处理从表单-post 数据中提取信息。
- 用户被引导回
/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。
我无法弄清楚 customState
和 if/how 的用途,我可以利用它向 return url 传递数据。具体来说,我希望在登录后将用户路由回他们原来的位置。我想我可以将原始 url 传递给参数 customState
并让它 returned 返回给我return url POST
,但它似乎被编码或可能被不同的值替换。
这是我想要实现的目标:
- 匿名用户访问
/page/protected
需要认证 - 代码调用
passport.authenticate
进而重定向用户登录。 - 用户登录并return进入预先配置的 return url 例如:
/auth/oidc/return
. - 代码处理从表单-post 数据中提取信息。
- 用户被引导回
/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。