NodeJS と Express を使用して Web サービスを作成しました。サービスはポート 8090 で実行されています。また、AngularJS でフロントエンドを作成し、ポート 8080 で実行しています。
Mongoには、すべてのユーザーのユーザー名とパスワードが保存されています
HTML5/AngularJS フロントエンド経由でログインすると、AngularJS アプリが高速の http ポスト リクエストを呼び出します。ユーザーが認証されます。そして、req.session.email = ユーザーのメールアドレスを設定します。
req.session.email がエクスプレスで正しく設定された AngularJS のコンソール ログに戻って確認することさえできます。
問題は、req.session.email が未定義でない場合にのみ、他の get/post 要求へのアクセスを許可するミドルウェア関数として機能する「restrict」という認証関数を Express で作成したことです。
ただし、セッションが設定された後でも、この Express の他の get/post リクエストが AngularJS アプリによって呼び出されている場合、この「制限」機能は req.session.email を未定義として受け取るため、呼び出しをブロックします。
AngularJS と Express の両方が同じマシン上にあります。しかし、これは問題ではないと思います。
エクスプレス コード スニペット
var url = 'mongodb://127.0.0.1:5555/contacts?maxPoolSize=2';
var mongojs = require('mongojs');
var db = mongojs(url,['data']);
var dbauth = mongojs(url,['users']);
// var request = require('request');
var http = require('http');
var express = require('express');
var cookieparser = require('cookie-parser');
var app = express();
var bodyParser = require('body-parser');
var session = require('express-session');
app.use(cookieparser());
app.use(session({secret:'v3ryc0mpl!c@t3dk3y', resave: false, saveUninitialized: true}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
var user_session;
app.all('*',function(req, res, next){
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
function restrict(req,res,next){
try{
if(req.session.email){
next();
}
else{
res.send('failed');
res.end();
}
}
catch(err){
res.send('failed');
res.end();
}
};
app.post('/login',function(req,res){
//removed DB function from here to make the code look simple
req.session.email = req.body.email;
req.session.password = req.body.password;
});
app.get('/loggedin',restrict,function(req,res){
res.send(true);
});
Express 関数を呼び出してセッション ステータスを確認する AngularJS 関数
var resolveFactory = function ($q, $http, $location,LoginDetails) {
var deferred = $q.defer();
$http.get("http://127.0.0.1:8090/loggedin")
.success(function (response) {
if(response == true){
deferred.resolve(true);
}
else
{
deferred.reject();
LoginDetails.setemail('');
LoginDetails.setpassword('');
$location.path("/");
}
})
.error(function (err) {
deferred.reject();
$location.path("/");
});
return deferred.promise;
};
基本的に、私が作成した AngularJS Resolve Function は成功するはずですが、成功していません。失敗しています。live-server を使用してラップトップで HTML/AngularJS を実行し、nodemon を使用して Express アプリを実行しています