2013-09-27 14 views
8

私はパスポートJS、エクスプレス、マングースを使用してAPIを作成しています。同じドメインでテストすると、セッションを維持して正常に動作します。しかし、クロスドメインでは失敗します。任意の手掛かりどのように私は同じ構成を使用してクロスドメインでセッションを維持することができます。以下は、コードパスポートjsはドメイン間でセッションを維持できません

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

と私のメインモジュールから呼び出します@ kundu_あなたは解決策を手に入れましたか? –

答えて

2

資格情報がとAccess-Control-Allow-Credentialsヘッダを設定することにより、共有することを許可しています。 XHRオブジェクトを介してJavaScriptから

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

その後、pass the credentials(あなたのコードにコメントしている私はなぜわかりません)。

xhr.withCredentials = true; 
6

私は同じ問題を抱えていました。

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

それは私の作品:急行アプリで何かを設定する前に、(正確に同じ)以下のクロスドメインのための応答のヘッダを設定するために使用します。運が良かった!スリハーシャの答えを1として

+0

なぜこのようにしなければならないのか分かりますか?資格情報が必要な理由 –

+0

あなたは素晴らしいです。私はこのために6時間を無駄にした。ありがとう男 –

+0

私は同じ問題に直面しており、この解決策はまだ私のために働いていません。私は何をすべきか?助けてください。 –

4

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

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

  • を資格認定要求とアクセス制御 - 許可 - 起源のためのワイルドカードを使用しないでください

    としてexplained on 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 

}; 
+0

ありがとうございます。 –

関連する問題