在Node / Express中基于JWT获取用户数据

时间:2016-04-07 10:57:41

标签: node.js express mongoose

这个问题专门针对我的代码,有一半是关于从节点API实际获取特定用户数据的高级视图。

所以我的用户注册/登录工作正常,并且假设我在用户和窗口小部件之间有一对多的映射,因此每个用户都可以从他或她的个人资料页面创建和删除窗口小部件。

所以这是我的数据库模型:

var User = new mongoose.Schema({
  email: {
    type: String,
    unique: true,
    required: true
  },
  hash: String,
  salt: String
  widgets    : [{  type: Schema.Types.ObjectId, 
            ref: 'widget' 
          }], 
});

var Widget = new mongoose.Schema({
  name         : String,
  type         : String,
  description  : String,
});

在用户登录过程中,我生成一个JWT并使用它来保存前端的授权标头。

现在我的问题是双重的。 1)如何正确保存小部件,以便它们与当前登录的用户相关联? 2)如何获取与用户关联的所有小部件?

我最初的想法是这样的:

app.get('api/widgets', function(req, res, next){
    // decode authorization header to get user email
    // run database query to return all widgets associated with user email
});

app.post('api/widgets', function(req, res, next){
    // decode authorization header to get user email
    // create widget and update user with widget ID
});

这是正确的想法吗?如果是这样,我将如何解码授权标头以获取用户的电子邮件?我是否需要为与用户关联的每个对象执行相同的过程?或者在Node / Express中有更快更方便的方法吗?

1 个答案:

答案 0 :(得分:2)

  

这是正确的想法吗?

在我看来,是的,这是正确的。

  

如果是这样,我将如何解码授权标头以获取用户的电子邮件?

如果您使用的是jsonwebtoken软件包,那么verify方法会对令牌进行解码。您甚至可以在单个令牌中存储多个值,例如电子邮件和名称。 verify会将令牌解码为具有两个属性的对象。

  

我是否需要为与用户关联的每个对象执行相同的过程?或者在Node / Express中有更快更方便的方法吗?

在每个请求上加载这些对象可能是最常用的方法。如果您发现此加载过程会降低应用程序的速度,则可以使用node-cacheRedis对其进行缓存(建议您使用分布式应用程序群集时)。

我还建议,不是将用户的令牌解码为每条路线上的电子邮件,而是使用catch all route来解码令牌并存储在{{1}中。 }}。 DRY!

locals