如何知道用户是否通过passport.js在子域名下登录

5
我已经创建了两个Mean.io应用程序,分别在domain.comsub.domain.com中,并且两个应用程序都按预期运行。但问题是,子域名中的一个应用程序(sub.domain.com)需要知道用户是否已登录主应用程序(domain.com)。
我知道passport处理会话并知道用户是否已登录,因为它在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个回答

1
我经过深入研究后找到了答案。
简短回答:使用localStorage是不可能的(数据只能被域访问,甚至不能为子域),这是Mean.io现在用来存储用户信息的工具。
长回答,每次只要您已登录,您就会向后端发送一个请求,Angular会在实际发送请求之前拦截请求(本文解释了这一点https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/)并添加一个授权标头,如下所示:
headers: 

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

后面的内容翻译如下:passport之后会使用护照将用户信息序列化到会话中,并将其放入req.user中。Bearer令牌存储在localStorage中,因此无法从域外获取。我想到的唯一方法是使用具有domain = '.domain.com'的cookie,以便每个子域都可以读取这些cookie。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接