护照对象空无法在护照/快递应用程序中调用,而不是调用deserializeUser

时间:2014-10-06 04:59:09

标签: angularjs node.js express passport.js

我在不同的域上有一个angularjs应用程序,呼叫对基于快速的api的请求。例如,我有一个在localhost:9000上运行的应用程序,并连接到api @ localhost:3000。快递是3.51,护照:0.1.18,Angularjs:1.2

对于快递我设置了cors并将allow credentials设置为true:

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

我在路由器之前初始化护照:

app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());*
app.use(app.router);

在我的AnguarJS前端,我设置默认值以在我的http请求中使用凭据:

$httpProvider.defaults.withCredentials = true; 

我错过了什么吗?登录后我看到serializeUser被调用。在后续请求中,我看到cookie在标题中发送:

GET /api/shows?themes=true HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Accept: application/json, text/plain, */*
Origin: http://localhost:9000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.122 Safari/537.36
Referer: http://localhost:9000/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: __distillery=OHFOIWEFOWEIJFO2352039832904BLAH; connect.sid=s%lweifjeill32ij3ri3KSLIJSEF.selfijseilfjsefeljkfe%2B%2BqUeXF0k
If-None-Match: "-2134790151"

然而,deserializeUser永远不会被调用,因为req.session上的护照对象是空的。我错过了什么吗?我在同一个域(localhost:3000)上也有一个登录页面,登录/护照工作正常。所以我认为它必须对跨域或标头设置做一些事情,但我不知道如何调试它。

更新 - 如果我将所有前端代码移动到api应用程序中(以便没有跨域发生,则身份验证和会话正常工作......

1 个答案:

答案 0 :(得分:1)

原来所有设置都是正确的,但在初次登录时,我发送了一个包含用户名/密码和{withCredentials: false}的帖子请求。这将创建一个新会话,但cookie正在引用现有会话。一旦我评论了这一点,我就能让它工作。