使用passport.js和express.js(node.js)创建一个安全的oauth API

我有一个特定的问题,除非我没有以正确的方式做事情.

我有两个应用程序,一个客户端(html站点)和一个API(用快速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,user或user id.

所以,从客户端(打开弹出窗口的网站),我尝试了不同的方法:

从弹出窗口获取值:由于重定向不起作用,我忘了弹出JavaScript信息

调用我的API来获取会话中的“当前用户”,如 http://api.com:3000/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对的映射.例如,如果需要,您可以使用它将跨域请求的Credentials设置为true.

$.ajax({
   url: a_cross_domain_url,
   xhrFields: {
      withCredentials: true
   }
});

我也不满意,因为我丢失了我的标题上的通配符:Access-Control-Allow-Origin,我需要指定一个域,如 here 所述.

所以,我不知道我应该采取的方法,我唯一需要的是客户端获取accessToken或从护照oauth进程返回的userID.这个想法是在API的每次调用中使用该标记来验证调用.

任何线索?

我遇到过同样的问题.我在登录页面上使用本地策略,然后检查用户是否在其他请求的会话中.

正如你所说,解决方案是使用CORS,以便使用XMLHTTPRequest在cookie中传递会话ID.

不用使用在所有浏览器上还没有工作的CORS,我勉强使用对其他请求的访问令牌.我使用的工作流程如下:

POST /login

>用户名和密码在身体中传递.

>使用本地策略的身份验证.

> Response返回用户对象,包括access_token

GET / endpoint / abc123?access_token = abcdefg

>从登录响应获得的令牌

>使用承载策略进行认证(在护照http-bearer中)

Express现在不需要会话.

我希望这个替代方案有所帮助.

代码日志版权声明:

翻译自:http://stackoverflow.com/questions/13933980/make-a-secure-oauth-api-with-passport-js-and-express-js-node-js

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章