13

パスポートJS、エクスプレス、マングースを使用してAPIを作成しています。同じドメインでテストすると、セッションが維持され、正常に動作します。しかし、クロスドメインでは失敗します。同じ構成を使用してクロスドメインでセッションを維持するにはどうすればよいですか。以下はコードです

 allowCrossDomain = function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    res.header("Access-Control-Allow-Headers", req.headers["access-control-request-headers"]);
    // res.header("Access-Control-Allow-Credentials", "true");
    if ("OPTIONS" == req.method) {
        res.send(200);
    } else {
        next();
    }

  //allow all crossDomain request
app.use(allowCrossDomain);

//session handling
app.use(express.cookieParser("gallery"));
app.use(express.session());
app.use(passport.initialize());
app.use(passport.session());

app.use(function(req, res, next) {
    // check if client sent cookie
    var cookie = req.cookies.cokkieName;
    if (cookie === undefined) {
        //set up cookie here by a random number
        });
    }
    next(); // <-- important!
});
passport.use(new LocalStrategy({
    usernameField: "email"
},
function(email, password, done) {
    User.authenticate(email, password, function(err, reply) {
       //authenticate user and call the callback
            return done(err, false);

    });
}));


passport.serializeUser(function(user, done) {
return done(null, user._id);
});


passport.deserializeUser(function(id, done) {
//find user via id and return the user details
return done(null, user._id);
});

   app.post("/login", function(req, res, next) {
    passport.authenticate("local",
        function(err, data, info) {
            //custom callback
            user.getProfile(req, res, next, err, data, info);
        })(req, res, next);
});
4

3 に答える 3

12

私は同じ問題を抱えていました。Express アプリで何かを構成する前に、次の (まったく同じ) を使用して、クロスドメインの応答のヘッダーを設定します。

app.use(function(req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
if ('OPTIONS' == req.method) {
     res.send(200);
 } else {
     next();
 }
});

わたしにはできる。頑張ってください!

于 2013-11-26T14:08:26.437 に答える
6

Sriharshaの答えによると:

  • 設定res.header("Access-Control-Allow-Credentials", "true");

  • クライアント側の呼び出しで資格情報を渡すようにしてください。たとえば、AJAX の場合、これを呼び出しに追加します。xhrFields: {withCredentials: true},

さらに:

  • 資格情報付きのリクエストで Access-Control-Allow-Origin にワイルドカードを使用しないでください

    MDN で説明されているように:

    認証済みのリクエストに応答するとき、サーバーはドメインを指定する必要があり、ワイルドカードは使用できません


このファイルを使用し、メインモジュールから次のように呼び出しますrequire("./enable-cors.js")(app);

// enable-cors.js
module.exports = function(app) {

    var methodOverride = require('method-override')
    app.use(methodOverride());
    var allowCrossDomain = function(req, res, next) {
        res.header('Access-Control-Allow-Credentials', true);
        res.header('Access-Control-Allow-Origin', req.headers.origin);
        res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
        res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');

        // intercept OPTIONS method
        if ('OPTIONS' == req.method) {
            res.send(200);
        }
        else {
            next();
        }
    };
    app.use(allowCrossDomain);
    // Built upon: http://cuppster.com/2012/04/10/cors-middleware-for-node-js-and-express/#sthash.WdJmNaRA.dpuf

};
于 2014-10-17T01:49:49.050 に答える
2

Access-Control-Allow-Credentialsヘッダーを設定して、資格情報の共有を許可します。(コードにコメントした理由がわかりません)

res.header("Access-Control-Allow-Credentials", "true");

次に、JavaScript から XHR オブジェクトを介して資格情報を渡します。

xhr.withCredentials = true;
于 2013-09-27T06:06:14.220 に答える