如何知道用户是否使用passport.js跨子域登录

时间:2015-08-12 11:12:46

标签: javascript node.js passport.js mean.io passport-local

我分别在 domain.com sub.domain.com 中创建了两个Mean.io应用程序,一切都按预期工作,但问题是子域中的一个( sub.domain.com )需要知道用户是否已登录主应用程序( domain.com )。

我知道护照处理会话并知道用户是否已登录,因为它在express.js中为每个请求创建了一个用户对象:

if (req.user) {
    // logged in
} else {
    // not logged in
}

这里不方便的是,这种方法在域内工作,但不在外部工作。换句话说,如果我向这样的后端发出请求:

$http.get('/api/users/me').success(this.onIdentity.bind(this));
来自 domain.com ,这将填充用户数据,但如果我直接从浏览器发出相同的请求,则返回null。

我需要了解如何跨域传递此信息?如果每次发出请求$http.get('/api/users/me').success(this.onIdentity.bind(this));,信息都会传递给后端吗?

1 个答案:

答案 0 :(得分:1)

经过深入研究后我找到了答案。

简短回答:使用localStorage是不可能的(数据只能通过域访问;甚至不能访问子域),这是Mean.io现在用来存储用户信息的工具。

答案很长,每次,只要你登录,就向后端发送请求,角度在实际发送之前拦截请求(这篇文章解释了这个https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/)并添加了这样的授权标题:

headers: 

{
     ...
     authorization: 'Bearer eyJhbGciOiJIUzI1NiJ9.JTdCJTIyX2lkJTIyOiUyMjU1ZDFjYmIxNDA..._rUsUBFxCQy3qqUGi9QGVD0YXCEk0', 
     ...
}

后来使用哪个护照将用户信息序列化为会话并将其放入req.user。承载令牌存储在localStorage中,因此无法从域外获取它。我提出的唯一方法是使用domain = '.domain.com'的Cookie,以便每个子域都可以读取这些Cookie。