NodeJS OAuth2.0原理

时间:2014-04-23 09:34:03

标签: node.js security oauth-2.0

最近我正在开发一个nodeJS项目,我正在考虑如何去实现我的移动应用程序的安全模块。我之前有过OAuth 2.0协议的经验,我曾在C#项目中使用过。

在.NET中有两个不错的开源项目

  1. https://github.com/thinktecture/Thinktecture.IdentityServer.v3
  2. https://github.com/thinktecture/Thinktecture.AuthorizationServer
  3. 前者是支持联合身份验证的身份提供程序,后者是OAuth 2.0提供程序。

    所以我决定为我的nodeJS应用程序使用相同的安全基础结构。但据我所知,没有任何东西可以与这些项目相提并论。

    我找到了一些非常好的项目,这些项目尚未完成但是一个良好的开端:

    另外,我遇​​到了一篇很好的文章,它提出了一种在nodeJS中处理身份验证的好方法。 https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/以及对stackoverflow的查询的类似答案。 Auth between a website and self-owned API

    根据我的理解,expressJwt保护我们的api,并且基本上将验证用户发送的访问令牌。但是我想更进一步,并将令牌与应用程序特定的范围相关联,其方式与OAuth2.0协议相似。因此,例如,我想分配一个写入,读取等范围,并使用expressJwt检查用户的令牌是否具有作为特定API端点访问所需的范围。

    如果您能就如何处理此主题提供一些建议,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

首先,您需要生成具有此类声明的令牌。这可以在API或其他地方:

var jwt = require('jsonwebtoken');

var claims = {
  name: user.name
  can_write: true,
  can_post_timeline: false
};

var token = jwt.sign(claims, 'my-super-secret');

然后,要验证您将执行以下操作:

var jwt = require('express-jwt');

app.use(jwt({secret: 'my-super-secret'}));

function require_time_line_access (req, res, next) {
  if (!req.user.can_post_timeline) return res.send(401);
  next();
}

app.post('/timeline', 
  require_time_line_access,
  function(req, res) {
    //do timeline stuff
  });

express-jwt验证令牌的签名,过期和其他一些事情。如果一切正常,它会将解码后的令牌放入req.user,如果不正常,则返回401.

require_time_line_access是一个确保用户拥有此声明的中间件,如果它没有返回401.您可以将此中间件放在需要此声明的每个端点中。