使用express / angularjs在子域之间共享cookie

时间:2016-08-26 05:43:05

标签: angularjs express cookies subdomain angular-cookies

我一直试图完成这项任务很长一段时间但尚未取得任何突破。如果有人能帮助我,我会非常感激。

现状:

我有两个应用程序,我在两个子域中运行

  

st.localhost:8080和acm.localhost:8080

当用户尝试访问其中一个网址时,我会使用Angular $ cookies服务搜索名为'auth'的Cookie。如果定义或存在cookie,则将用户重定向到原始应用程序。但是,如果未定义cookie,则会将用户重定向到登录页面(登录页面同时驻留在两个应用程序中)。

在登录页面中,成功完成凭据检查后,我再次使用随机值设置'auth' Cookie。这个cookie应该在两个子域之间共享。

快递:

    $scope.login = function(formValid){
        $scope.incorrectCredentials = false;
        if(formValid){
            $http.get('/login', 
                {
                    params: {
                        username: $scope.username,
                        password: $scope.password
                    },
                    headers : {
                        'Accept' : 'application/json'
                    }
                }
            ).then(function(response){
                $scope.incorrectCredentials = false;
                var obj = $cookies.getObject('auth');
                console.log("auth is: " + obj);
                $state.go($stateParams.origin);
            }, function(response){
                $scope.incorrectCredentials = true;
            });
        }
    }

以下登录功能由ST和ACM应用程序共享

     var obj = $cookies.getObject('auth');
     console.log("auth is: " + obj);

Express能够成功创建cookie'auth',因为我可以在/ login服务响应中看到Set-Cookie标头。但是,浏览器没有将此cookie附加到我从我的应用程序(例如st.localhost)创建的后续API请求中。我也无法通过Angular读取这个cookie。

 $( function() {
    $("#datepicker").datepicker({
        minDate: new Date(),
        beforeShowDay: function(date) {
            var day = date.getDay();
            return [(day != 0), ''];
        }
    });
    } );

导致obj未定义。

enter image description here

我觉得我将cookie的域名设置为来自其中一个子域的“localhost”的方式有问题。

有关我可能做错的任何建议吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

这是我第二次回答自己的问题。我想在下次发布问题之前我需要更耐心一点。无论如何,我希望这个答案对那些像我一样陷入类似情况的人有所帮助。

首先,我发现即使您在其中一个子域中创建了,也可以在子域之间共享Cookie 。但是,有一些帖子/答案说不然。

在其中一个子域中创建cookie时需要做的是参数“domain”需要设置为父域值。例如,如果您在 st.testserver.com 中创建Cookie,则在设置可共享Cookie时,必须将“domain”参数设置为'。testserver'

但是,如果您的父域名也是顶级域名(TLD),那么您将无法在子域名中创建共享Cookie。这正是我在发布这个问题时发生的事情。

当我使用st.localhost并尝试创建一个'domain'为'.localhost'的cookie时,它不允许我这样做,因为localhost在这里是TLD。但是当我将我的域名重命名为st.testserver.com时,我能够将'domain'创建为'.testserver.com',因为它不再是TLD了。

我希望有人可以验证此答案一次,如果我提供了任何不正确的信息,请告诉我。

感谢。

答案 1 :(得分:0)

Cookies是特定于域的,如果您想跨域访问,则需要使用一些跨存储(如跨存储等)。