APIとしてのみ機能するSails.js(v0.12.0)アプリがあります。 1ページのアプリケーションは、このアプリケーションのエンドポイントにajax呼び出しを行います。Sails.jsは各呼び出しで新しいセッションを作成します
ルート'PUT /login'
はユーザの認証に使用され、コントローラではreq.session.authenticated = true
と設定されています。
コントローラの他のすべての機能のpolicies.jsファイルには'*':['isAuthenticated']
が含まれています。 このポリシーは非常に簡単です:私はRedisの("connect-redis": "^3.0.2")
で値を検査する場合
module.exports = function isAuthenticated(req, res, next) {
if (req.session.authenticated) {
return next();
}
return res.forbidden('You are not permitted to perform this action.');
};
私は、セッションオブジェクトに設定された値を見ることができます。
次に、'GET /profile'
を呼び出すと、ユーザーが認証されてからポリシーが渡されます。
これは、私の開発マシン(ubuntu)上でsailsアプリケーションとRedisでローカルに動作し、郵便局員もローカルで(つまり、localhostドメイン上のすべて)使用します。
この問題は、すぐに稼働する本番システムにアプリをデプロイするときに発生します。 UIはサイト上のすべてのWebコンテンツを提供するApache上で動作するPHPアプリケーションです。
このフロントエンドアプリの一部の部分は、2番目のサーバーで実行されるsails.jsバックエンドを使用しています。 http://1.1.1.1/index.php
がロードされており、この単一ページのアプリケーションから、http://1.1.1.2/login
などに電話がかけられています。 まだドメインが登録されていません。テスト中は2つのIPアドレスを使用しています。ここで使用されているipは単なる例です。
セイルアプリで/login
を呼び出すと、ユーザーは認証され、セッションが更新されます。これはredis-cliを使用して正しいことがわかります。 (Redisはノード/セイルボックスでも実行されています)。
/profile
への次の呼び出しは、(ポリシーのために)403で失敗します。リクエストヘッダーでは、がhttp://1.1.1.1
であり、クッキーにsails.sidが含まれ、応答にSet-Cookie
が含まれていますが、sails.sidとは異なることがわかります。
redis-cliでは、2番目の呼び出しで新しいセッションが作成されていることがわかります。したがって、/profile
への呼び出しは何とか同じセッションを使用していないようです。
ブラウザからの呼び出し:cors.js
で
$http({
method: 'GET',
url: 'http://1.1.1.2/profile',
withCredentials:true
})
.then(function (response) {
console.log(response);
});
、私は理解したように、これは呼び出しがhttp://1.1.1.1
まだ最初のセッションが再び使用されていないhttp://1.1.1.2
から来て許可する必要があり
module.exports.cors = {
allRoutes: true,
origin: 'http://1.1.1.1,http://1.1.1.2',
credentials: true,
methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
headers: 'content-type'
};
持っていますisAuthenticated
ポリシーの対象となる任意のエンドポイントへのコールはすべて失敗する403.
すべてが "自分のマシンで動作する"ので、私は2つのドメインに関するどこかで自分の設定に問題があると思っています。
ご協力いただきますようお願い申し上げます。