角度路由和节点重定向

时间:2016-08-18 20:08:29

标签: javascript angularjs node.js redirect saml

我正在尝试使用passport-saml为我的应用程序添加SAML身份验证。我正在使用Angular进行路由。在加载主页时,我通过GET请求检查用户到我的节点服务器" / auth"检查req.user,如果确实如此,我会发回登录的用户数据;如果为false,我发回错误信息。我有这个用户数据响应的数据绑定,所以如果没有用户数据,我仍然显示"登录"按钮。

点击"登录"按钮,我执行重定向到节点服务器" / login"。这有一个passport.authenticate函数,它运行然后与" / assert"当它完成重定向时。**正是在这一点上我遇到了问题。**我的重定向总是进入" /"因为我正在执行重定向并使用角度路由所以我不知道如何存储这条路线说" / myPage1"或" / myPage2"。注意:我不想总是发回" / myPage1",我希望能够"登录"从任何观点来看SPA。

我是以错误的方式解决这个问题吗?这是使用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'});
    }
});

1 个答案:

答案 0 :(得分:0)

我找到了达到预期效果的方法。

在制作"登录"之前打电话,我再次打电话给" / setSessionRedirectUrl"它将当前window.location.href从angular传递到节点服务器以进行会话存储。

app.post('/setSessionRedirectUrl', function (req, res) {
    req.session.samlLoginRedirectUrl = req.body.redirectUrl;
    res.send();
});

然后在登录后运行断言功能时,它正在寻找要重定向到的req.session.samlLoginRedirectUrl。它有效!