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

栏目: Node.js · 发布时间: 5年前

内容简介:代码日志版权声明:翻译自:http://stackoverflow.com/questions/13933980/make-a-secure-oauth-api-with-passport-js-and-express-js-node-js

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

我有两个应用程序,一个客户端(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


以上所述就是小编给大家介绍的《使用passport.js和express.js(node.js)创建一个安全的oauth API》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Scratch少儿趣味编程

Scratch少儿趣味编程

[ 日] 阿部和广 / 陶 旭 / 人民邮电出版社 / 2014-11 / 59.00元

Scratch 是麻省理工学院设计开发的一款编程工具,是适合少儿学习编程和交流的工具和平台,有中文版且完全免费。本书结合孩子们学习的语文、数学、科学、社会、音乐、体育等科目,手把手地教大家如何用Scratch 设计程序(如设计一个自动写作文的程序),配合各式卡通形象,通俗易懂,寓教于乐。麻省理工学院教授米切尔•瑞斯尼克作序推荐。 本书图文并茂,生动风趣,适合中小学生等初学者自学或在家长的帮助......一起来看看 《Scratch少儿趣味编程》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换