0

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

现在的情况:

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

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”的方式有问题。

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

提前致谢。

4

2 回答 2

2

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

首先,我发现即使您在其中一个子域中创建cookie,也可以在子域之间共享 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。

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

谢谢。

于 2016-08-26T23:47:11.250 回答
0

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

于 2020-02-19T09:15:27.957 回答