Angular 路由和节点重定向
Angular Routing and Node Redirect
我正在尝试使用 passport-saml 为我的应用程序添加 SAML 身份验证。我正在使用 Angular 进行路由。在加载主页时,我通过对我的节点服务器“/auth”的 GET 请求来检查用户以检查 req.user
,如果是真的,我将发回登录的用户数据;如果为假,我会发回一条错误消息。我在这个用户数据响应上有数据绑定,所以在没有用户数据的情况下,我仍然显示 "Log in" 按钮。
单击 "Log in" 按钮后,我执行重定向到节点服务器“/login”。这会执行 passport.authenticate 函数,该函数会运行,然后在完成重定向时与“/assert”关联。** 在这一点上我 运行 遇到了问题。** 我的重定向总是转到“/”,因为我正在执行重定向并使用 angular 路由,所以我不知道如何存储此路由,比如“/myPage1”或“/myPage2”。注意:我不想总是发回“/myPage1”,我希望能够从 SPA 中的任何视图 "Login"。
我是不是用错了方法?这是使用 Angular 路由的限制吗?
Angular
$scope.login = function () {
window.location.href = 'http://example.com/login';
};
function getCreds() {
$http.get('http://example.com/auth', { withCredentials: true })
.then(function (response) {
$scope.creds = response.data;
});
}
Node.js
app.get('/login', passport.authenticate('saml', { failureRedirect: '/login' }));
app.post("/assert", passport.authenticate('saml', { failureRedirect: '/login' }), function (req, res) {
// console.log('session' + JSON.stringify(req.session));
// console.log("original url " + req.session.originalUrl);
if (req.session.originalUrl) {
res.redirect(req.session.originalUrl);
}
else {
res.redirect('/');
}
});
app.get('/auth', function (req, res) {
var authenticated = req.user;
if (authenticated) {
res.send(req.user);
} else {
res.send({statusCode: 401, message: 'User session is not alive'});
}
});
我找到了达到预期效果的方法。
在进行 "Login" 调用之前,我对“/setSessionRedirectUrl”进行了另一个 api 调用,它将当前 window.location.href 从 angular 传递到节点服务器以进行会话存储.
app.post('/setSessionRedirectUrl', function (req, res) {
req.session.samlLoginRedirectUrl = req.body.redirectUrl;
res.send();
});
然后当断言函数在登录后 运行 时,它正在寻找要重定向到的 req.session.samlLoginRedirectUrl
。有效!
我正在尝试使用 passport-saml 为我的应用程序添加 SAML 身份验证。我正在使用 Angular 进行路由。在加载主页时,我通过对我的节点服务器“/auth”的 GET 请求来检查用户以检查 req.user
,如果是真的,我将发回登录的用户数据;如果为假,我会发回一条错误消息。我在这个用户数据响应上有数据绑定,所以在没有用户数据的情况下,我仍然显示 "Log in" 按钮。
单击 "Log in" 按钮后,我执行重定向到节点服务器“/login”。这会执行 passport.authenticate 函数,该函数会运行,然后在完成重定向时与“/assert”关联。** 在这一点上我 运行 遇到了问题。** 我的重定向总是转到“/”,因为我正在执行重定向并使用 angular 路由,所以我不知道如何存储此路由,比如“/myPage1”或“/myPage2”。注意:我不想总是发回“/myPage1”,我希望能够从 SPA 中的任何视图 "Login"。
我是不是用错了方法?这是使用 Angular 路由的限制吗?
Angular
$scope.login = function () {
window.location.href = 'http://example.com/login';
};
function getCreds() {
$http.get('http://example.com/auth', { withCredentials: true })
.then(function (response) {
$scope.creds = response.data;
});
}
Node.js
app.get('/login', passport.authenticate('saml', { failureRedirect: '/login' }));
app.post("/assert", passport.authenticate('saml', { failureRedirect: '/login' }), function (req, res) {
// console.log('session' + JSON.stringify(req.session));
// console.log("original url " + req.session.originalUrl);
if (req.session.originalUrl) {
res.redirect(req.session.originalUrl);
}
else {
res.redirect('/');
}
});
app.get('/auth', function (req, res) {
var authenticated = req.user;
if (authenticated) {
res.send(req.user);
} else {
res.send({statusCode: 401, message: 'User session is not alive'});
}
});
我找到了达到预期效果的方法。
在进行 "Login" 调用之前,我对“/setSessionRedirectUrl”进行了另一个 api 调用,它将当前 window.location.href 从 angular 传递到节点服务器以进行会话存储.
app.post('/setSessionRedirectUrl', function (req, res) {
req.session.samlLoginRedirectUrl = req.body.redirectUrl;
res.send();
});
然后当断言函数在登录后 运行 时,它正在寻找要重定向到的 req.session.samlLoginRedirectUrl
。有效!