我分别在 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));
,信息都会传递给后端吗?
答案 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。