【发布时间】:2012-12-05 17:15:06
【问题描述】:
我想到了一个具体的问题,除非我没有以正确的方式做事。
我有一个包含 2 个面的应用程序,一个客户端(html 站点)和一个 API(使用 express + mongodb 构建)。 API 需要被安全访问。他们都在不同的域上,现在假设我的网站在 domain.com 上,我的 API 在 api.com:3000 上。
当我使用他们的数据创建用户时,我添加了护照以从 Github 获取访问令牌,因此我基本上可以“使用 Github 登录”。
我目前的流程是:
1) 客户端(站点),在 API 上打开一个弹出窗口
window.open("http://api.com:3000/oauth")
2)快递服务器,启动护照进程:
app.get('/oauth', passport.authenticate('github'), function(req, res) {
});
对于策略,我使用了this code。
3) 我将回调重定向到关闭弹出窗口的 url(带有 window.close() 的 JavaScript):
app.get('/oauth/callback', passport.authenticate('github', { failureRedirect: '/' }), function(req, res) {
res.redirect('/auth_close');
});
此时,一切都很好,我现在已登录 API。我的问题是如何将数据返回给客户端,因为客户端对 accessToken、用户或用户 ID 一无所知。
所以,从客户端(打开弹出窗口的网站),我尝试了不同的方法:
从弹出窗口中获取值:由于重定向不起作用,我忘记了弹出窗口的 javascript 信息
调用我的API获取会话中的“当前用户”,如http://api.com:3000/current 还有一个要求,并不理想,但这一项工作。但是,我还是有问题。
如果我从浏览器访问此 /current url,它会返回用户,因为浏览器会在标头请求中发送快速会话 cookie:
Cookie:connect.sid=s%3AmDrM5MRA34UuNZqiL%2BV7TMv6.Paw6O%2BtnxQRo0vYNKrher026CIAnNsHn4OJdptb8KqE
问题是我需要从 jquery 或类似的请求中发出这个请求,这就是它失败的地方,因为没有发送会话。所以用户没有返回:
app.get('/current', function() {
// PROBLEM HERE, req.user is undefined with ajax calls because of the session!
});
我找到了一种让它工作的方法,但我不满意,因为我会遇到跨浏览器的 CORS 问题,这是为了表达:
res.header("Access-Control-Allow-Credentials", "true");
并在 jquery ajax 调用中添加 withCredentials 字段,如 here 所述。
要在本机 XHR 对象上设置的 fieldName-fieldValue 对的映射。例如,如果需要,您可以使用它为跨域请求设置 withCredentials 为 true。
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
我对此也不满意,因为我丢失了标题上的通配符:Access-Control-Allow-Origin,我需要指定一个域,如 here 所述。
所以,我不确定我应该在这里采取的方法,我唯一需要的是客户端从护照 oauth 过程中获取 accessToken 或用户 ID。这个想法是在每次调用 API 时使用该令牌来验证调用。
有什么线索吗?
【问题讨论】:
-
你找到什么了吗?我也有同样的问题:(
-
您可以看到我的this 对此的回答。它对我有用。
标签: node.js api express oauth passport.js