2

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 アプリを実行しています

4

1 に答える 1

3

Ok!その理由は、AngularJS が別のポート 8080 で実行されているためです。

Express はポート 8090 で実行されていました。これは、AngularJS が Express の API を呼び出す場合、Express がセッションを AngularJS に渡すことを許可し、AngularJS が{withCredentials: true}パラメーター セットを使用して Express の API を呼び出さない限り、Express のセッションが失われることを意味します。以下は、AngularJS と ExpressJS が異なるポートで実行されているときにセッションを維持するために必要な変更です。

AngularJS では、Express から呼び出すすべての API を確認します。 {withCredentials: true}このようにする必要があります。

$http.get('http://expressdomainname:expressport/api',{withCredentials: true})

$http.post を使用する場合と同様に、パラメータ {withCredentials: true} が重要です

今すぐエクスプレス側に

このようなアプリ設定があることを確認してください

app.all('*',function(req, res, next){

//Origin is the HTML/AngularJS domain from where the ExpressJS API would be called
    res.header('Access-Control-Allow-Origin', 'http://localhost:8080');
    res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type');

//make sure you set this parameter and make it true so that AngularJS and Express are able to exchange session values between each other 
    res.header("Access-Control-Allow-Credentials", "true");
    next();

});

このトピックについてお持ちの場合は、お気軽に質問してください。これを解決するために何日も費やしました。

于 2015-11-09T16:04:08.713 に答える