如何知道用户是否在跨子域使用passport.js登录
How to know if user is loggedin in with passport.js across subdomains
我创建了两个Mean。IO应用程序在domain.com和sub.domain.com分别和一切工作如期进行,但问题是,一个在子域(sub.domain.com)需要知道用户是否登录在主应用程序(domain.com)。
我知道passport处理会话,并且知道用户是否登录,因为它为express.js中的每个请求在req中创建了一个user对象:
if (req.user) {
// logged in
} else {
// not logged in
}
这里的不便之处在于,这种方法只能在域内工作,而不能在域外工作。换句话说,如果我向后端发出这样的请求:
$http.get('/api/users/me').success(this.onIdentity.bind(this));
from domain.com,这将填充用户数据,但如果我直接从浏览器发出相同的请求,例如,它返回null。
我需要了解如何跨域传递此信息?如果每次发出此请求$http.get('/api/users/me').success(this.onIdentity.bind(this));
时,信息都传递到后端?
经过一番深入研究,我找到了答案。
简短的回答:使用localStorage是不可能的(数据只能通过域访问;甚至对于子域也不例外),这是工具的平均值。IO现在用来存储用户信息。
长回答,每次,只要你登录,你发送一个请求到后端,angular在实际发送之前拦截请求(这篇文章解释了这个https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/),并添加一个像这样的授权头:
headers:
{
...
authorization: 'Bearer eyJhbGciOiJIUzI1NiJ9.JTdCJTIyX2lkJTIyOiUyMjU1ZDFjYmIxNDA..._rUsUBFxCQy3qqUGi9QGVD0YXCEk0',
...
}
, passport随后使用它将用户信息序列化到会话中,并将其放在req.user中。承载令牌存储在localStorage中,因此不可能从域外获取它。我想到的唯一方法是用domain = '.domain.com'
的cookie这样每个子域名都可以读取这些cookie
- Passport.js成功的身份验证根本没有调用
- 如何在使用Passport.js和Sails.js注册后重定向到特定位置
- Passport.js`isAuthenticated()`不一致的行为;当它应该是真的时候是假的
- ExpressJs+Passport.js+MySQL身份验证
- Passport.js:使用主干网访问用户
- 在passport.js中使用令牌验证电子邮件
- 通过oauth令牌passport.js访问用户配置文件
- Passport.js Execution
- 如何使用Passport.js本地策略检查当前密码并(如果正确)更新密码
- 使用Passport.js获取路由之外的当前用户
- Passport js通过url进行身份验证
- req.user在使用express服务器passport.js进行twitter身份验证后未定义
- Grant vs Passport.js?
- 如何在 Node 中使用 Passport.js 模拟其他用户
- use express.bodyParser() and passport.js
- $http POST & Passport.Js Redirect
- 如何从 Passport.js 更改本地策略身份验证的用户对象
- 如果我的站点只有 2 或 3 个管理员,我是否应该设置 Passport.js 或类似进行身份验证
- angular.js知道passport.js会话是否已设置的最佳方式是什么
- Passport.js和MongoStore错误“;在MongoStore中找不到连接策略”;