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

莱昂纳多摩托艇

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

我知道通行证会处理会话并知道用户是否登录,因为它会为express.js中的每个请求在req中创建一个用户对象:

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));,信息都会传递到后端?

莱昂纳多摩托艇

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

简短的答案:使用localStorage是不可能的(数据只能按域访问;即使对于子域也不能访问),这是Mean.io现在用来存储用户信息的工具。

长答案,每次,只要您登录,就向后端发送请求,在实际发送之前先拦截请求(本文解释了此https://auth0.com/blog/2014/01/07/ angularjs-authentication-with-cookies-vs-token /),并添加如下所示的授权标头:

headers: 

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章