首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用passport.js和express.js (node.js)创建安全的oauth API

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

Stack Overflow用户
提问于 2012-12-18 21:23:07
回答 2查看 22.2K关注 0票数 18

我想我有一个具体的问题,除非我没有以正确的方式做事情。

我有一个两端的应用程序,一个客户端(html站点)和一个API (用express +mongodb构建)。需要安全地访问API。它们都在不同的域上,现在假设我的站点在domain.com上,我的应用程序接口在api.com:3000上。

当我使用Github的数据创建我的用户时,我添加了passport来从Github获取访问令牌,所以我基本上可以有一个"Sign in with Github“。

我目前的流程是:

1)客户端(站点)在API上打开弹出窗口

代码语言:javascript
复制
window.open("http://api.com:3000/oauth")

2) express服务器,启动passport流程:

代码语言:javascript
复制
app.get('/oauth', passport.authenticate('github'), function(req, res) {

});

对于策略,我使用了this code

3)我将回调重定向到一个关闭弹出窗口的url (带有window.close()的javascript):

代码语言:javascript
复制
app.get('/oauth/callback', passport.authenticate('github', { failureRedirect: '/' }), function(req, res) {
    res.redirect('/auth_close');
});

至此,一切都很好,我现在登录到了API中。我的问题是如何将数据返回给客户端,因为客户端还不知道任何关于accessToken、用户或用户id的信息。

因此,在客户端(打开弹出窗口的站点),我尝试了不同的方法:

从弹出窗口获取一个值:由于重定向不起作用,我丢失了弹出的javascript information

  • calling my

如果我从浏览器访问这个/current url,它将返回用户,因为浏览器在头请求中发送了express session cookie:

代码语言:javascript
复制
Cookie:connect.sid=s%3AmDrM5MRA34UuNZqiL%2BV7TMv6.Paw6O%2BtnxQRo0vYNKrher026CIAnNsHn4OJdptb8KqE

问题是我需要从jquery或类似的地方发出这个请求,这就是它失败的地方,因为会话没有被发送。因此不会返回用户:

代码语言:javascript
复制
app.get('/current', function() {
    // PROBLEM HERE, req.user is undefined with ajax calls because of the session!
});

我找到了一种让它工作的方法,但我对此并不满意,因为我会遇到跨浏览器的CORS问题,这是对express的补充:

代码语言:javascript
复制
res.header("Access-Control-Allow-Credentials", "true");

并在jquery ajax调用中添加withCredentials字段,如here所述。

要在本机XHR对象上设置的fieldName-fieldValue对的映射。例如,如果需要,您可以使用它将跨域请求的withCredentials设置为true。

代码语言:javascript
复制
$.ajax({
   url: a_cross_domain_url,
   xhrFields: {
      withCredentials: true
   }
});

我对此也不满意,因为我丢失了头文件中的通配符:Access-Control-Allow-Origin,我需要指定一个域,正如here所解释的那样。

所以,我不确定我在这里应该采取什么方法,我唯一需要的是客户端从passport oauth过程中获得一个accessToken或一个userID。其思想是在每次对API的调用中使用该令牌来验证调用。

有什么线索吗?

EN

回答 2

Stack Overflow用户

发布于 2013-01-24 00:00:15

我也有同样的问题。我在登录页面上使用Local Strategy,然后检查用户是否在其他请求的会话中。

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

而不是使用CORS,它还不能在所有浏览器上工作,我决定在其他请求上使用访问令牌。我使用的工作流程如下:

代码语言:javascript
复制
POST /login

使用本地Strategy.

  • Response在body.

  • Authentication中传递
  • 用户名和密码将返回用户对象,包括access_token

GET /endpoint/abc123?access_token=abcdefg

使用承载策略从登录response

  • Authentication获取的
  • 令牌(在passport-http-bearer)

Express中现在不需要会话。

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

票数 13
EN

Stack Overflow用户

发布于 2013-11-26 21:52:20

在express app中配置任何东西之前,请使用以下(完全相同)来设置跨域的响应头部:

代码语言:javascript
复制
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
if ('OPTIONS' == req.method) {
     res.send(200);
 } else {
     next();
 }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13933980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档