【问题标题】:share cookies between subdomains using express/angularjs使用 express/angularjs 在子域之间共享 cookie
【发布时间】:2017-01-02 16:45:02
【问题描述】:

我一直在努力完成这项任务,但还没有任何突破。如果有人能在这方面帮助我,我将非常感激。

现状:

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

st.localhost:8080 和 acm.localhost:8080

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

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

快递:

var express = require('express');
var httpProxy = require('http-proxy');
var vhost = require('vhost');

var app = express();
var proxy = httpProxy.createProxyServer();

app.get('/login', function(req, res) {
    var randomNumber=Math.random().toString();
    randomNumber=randomNumber.substring(2,randomNumber.length);
    var expireDate = new Date();
    expireDate.setDate(expireDate.getDate() + 1);
    res.cookie('auth', randomNumber, { maxAge: 90000000, domain: 'localhost', httpOnly: false });
    console.log('cookie created successfully');    
    res.send('Login successful');
});

app.use('/api', function(req, res) {    
    req.headers[ 'Authorization' ] = 'Basic dXNlcjpwYXNzd29yZA==';
    console.log("Request cookies: " + req.cookie);
    proxy.web(req, res, { target: 'restApiTarget' });
});

// ST application
app.use(vhost('st.localhost', express.static('./st')));

// ACM application
app.use(vhost('acm.localhost', express.static('./acm')));

app.listen(8080, function () {
    console.log('Fweb server running on port 8080!');
});

角度

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

    $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;
            });
        }
    }

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

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

导致 obj 未定义。

我感觉我将 cookie 的域设置为子域之一的“localhost”的方式有问题。

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

提前致谢。

【问题讨论】:

    标签: angularjs express cookies subdomain angular-cookies


    【解决方案1】:

    Cookies 是特定于域的,如果你想跨域访问,你需要使用一些交叉存储,比如跨存储等。

    【讨论】:

      【解决方案2】:

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

      首先,我发现可以在子域之间共享 cookie,即使您在其中一个子域中创建它也是如此。但是,有些帖子/答案另有说明。

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

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

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

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

      谢谢。

      【讨论】:

      猜你喜欢
      • 2018-08-27
      • 2013-08-31
      • 1970-01-01
      • 2017-05-14
      • 2017-07-14
      • 2021-03-23
      • 2011-05-31
      • 1970-01-01
      相关资源
      最近更新 更多