NodeJS OAuth2.0原则

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

在.NET中有两个很好的开源项目

  1. https://github.com/thinktecture/Thinktecture.IdentityServer.v3
  2. https://github.com/thinktecture/Thinktecture.AuthorizationServer

前者是支持联合身份validation的身份提供者,后者是OAuth 2.0提供者。

所以我决定为我的nodeJS应用程序使用相同的安全基础结构。 但据我所知,这些项目没有什么相同之处。

我发现了一些非常好的项目,这些项目还没有完成,但是一个好的开始:

  • https://www.npmjs.org/package/node-oauth2-server
  • https://github.com/domenic/restify-oauth2

另外,我遇​​到了一篇不错的文章,提出了一个在nodeJS中处理身份validation的好方法。 https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/和一个类似的答案在stackoverflow上的查询。 在网站和自有API之间进行身份validation

据我所知,expressJwt守卫我们的api,基本上会validation用户发送的访问令牌。 但我想更进一步,将令牌与应用程序特定的作用域相关联,与OAuth2.0协议类似。 因此,例如,我想分配一个写,读等范围,并expressJwt检查用户的令牌是否具有作为特定的API端点访问所需的范围。

如果您能提供一些关于如何处理这个问题的build议,我将不胜感激。

首先,您需要生成具有此类声明的令牌。 这可能在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'); 

然后,validation你会做这样的事情:

 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-jwtvalidation令牌的签名,过期和其他一些事情。 如果一切正常,则将解码的标记置于req.user ,如果不req.user ,则返回401。

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