0

私はかなり長い間このタスクを達成しようとしてきましたが、まだブレークスルーがありません. 誰かがこれで私を助けることができれば、私は本当に感謝しています.

現在の状況:

2 つのサブドメインで実行している 2 つのアプリケーションがあります。

st.localhost:8080 および acm.localhost:8080

ユーザーがいずれかの URL にアクセスしようとすると、Angular の $cookies サービスを使用して「auth」という名前の Cookie を検索します。Cookie が定義されているか存在する場合、ユーザーは元のアプリケーションにリダイレクトされます。ただし、Cookie が定義されていない場合、ユーザーはログイン ページにリダイレクトされます (ログイン ページは両方のアプリケーションに存在します)。

ログインページから、資格情報の確認が成功した後、「auth」 Cookie をランダムな値で再度設定しました。この Cookie は、2 つのサブドメイン間で共有されるはずです。

特急:

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

/login サービス応答で Set-Cookie ヘッダーを確認できるため、Express は Cookie 'auth' を正常に作成できます。ただし、ブラウザーは、アプリケーション (st.localhost など) から作成している後続の API 要求にこの Cookie を添付していません。Angular でもこの Cookie を読み取ることができません。

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

obj が未定義になります。

ここに画像の説明を入力

サブドメインの 1 つから Cookie のドメインを「localhost」として設定する方法に問題があると感じています。

私が間違っているかもしれないことについて何か提案はありますか?

前もって感謝します。

4

2 に答える 2

2

自分の質問に回答するのはこれで 2 回目です。質問を投稿する前に、次回からはもっと辛抱強くなる必要があると思います。とにかく、この回答が私と同じような状況で立ち往生している人に役立つことを願っています.

まず、サブドメインの 1 つで Cookie を作成しても、サブドメイン間で Cookie を共有できることがわかりました。ただし、そうではないという投稿/回答がいくつかありました。

サブドメインの 1 つで Cookie を作成する際に必要なことは、パラメータ「ドメイン」を親ドメインの値として設定する必要があることです。たとえば、st.testserver.comで Cookie を作成している場合、その中に共有可能な Cookie を設定するときに、'domain' パラメータを'.testserver'として設定する必要があります。

ただし、親ドメインがトップ レベル ドメイン (TLD) でもある場合、サブドメインで共有 Cookie を作成することはできません。これは、私がこの質問を投稿したとき、まさに私に起こっていたことです。

st.localhost を使用していて、「ドメイン」を「.localhost」として Cookie を作成しようとしたとき、ここの localhost は TLD であるため、作成できませんでした。しかし、ドメイン名を st.testserver.com に変更したところ、TLD ではなくなったため、「ドメイン」を「.testserver.com」として Cookie を作成できました。

誰かがこの回答を一度検証して、間違った情報を提供した場合はお知らせください.

ありがとう。

于 2016-08-26T23:47:11.250 に答える