使用Node.js,Passport,Backbone进行跨域会话身份验证

时间:2014-07-02 20:22:05

标签: node.js backbone.js passport.js

我使用带有快速服务器的Node.js和用于身份验证的护照包。客户端位于同一服务器上,不同的域构建在Backbone.js上。会话是在登录请求时创建的,但如果另一个请求来自客户端,我无法访问会话。

节点服务器配置:

var express = require( 'express' ), 
    path = require( 'path' ),
    mongoose = require( 'mongoose' ), 
    passport = require('passport'), 
    cors = require('cors');

app.configure( function() {
    app.use(express.cookieParser());
    app.use(express.bodyParser()); 

    app.use(express.session({ 
        secret: secret,
        key: key,
        cookie : {
            maxAge: maxAge
          }
            })); 

    app.use(passport.initialize());
    app.use(passport.session()); 
    app.use( express.methodOverride() );

    app.use( app.router );
    app.use( express.static(application_root) );

    app.use(cors());
});

登录并验证:

app.post('/login', cors(corsOptions), passport.authenticate('login', {
    successRedirect : successDirect, 
    failureRedirect : failureDirect
}));

function requireAuth(req, res, next) { 
    if(req.session.user) {
        next();
    }
    else if (req.cookies.isAuthenticated) {
        next();
      } else {
       res.redirect(loginUrl);
      }
    }

登录时,会话已创建。如果我从服务器端发送任何请求(localhost:9999 / anymethod),则访问会话,相应地做出响应。如果我尝试将客户端的请求发送到同一个URL,则会话始终为“未定义”。

示例:

app.get('/mymethod', cors(corsOptions), requireAuth, function(request, response) {
    return response.send("Done");
});

此方法在登录后从服务器访问时有效,但在从客户端访问时无效(客户端在同一服务器,不同域上建立)。

添加到Backbone.js:

 initialize: function() {
        this.collection.fetch({reset: true, beforeSend: this.beforeFetch}); 
    },
    beforeFetch: function(xhr) {
        xhr.withCredentials = true;
    },...

编辑:来自客户端的请求不包含任何cookie。

如何在登录后访问护照创建的会话,从客户端发送请求?

1 个答案:

答案 0 :(得分:0)

我猜cors图书馆就是这样做的(我还没有用过那个图书馆)。但如果它不在服务器端

  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,PATCH');
    res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
    next();
 });

在客户端ajax请求中

 xhrFields: {
     withCredentials: true
 }