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。有效!