【问题标题】:Get user access tokens and authenticate request获取用户访问令牌并验证请求
【发布时间】:2015-11-14 16:48:12
【问题描述】:

我相信我已经花了很多时间通过strongloop NodeJS 的 REST 框架来解码这个 pendora 盒子。我已经成功地按照教程设置了一个two factor authentication 模块。这很好用,将mongo 设置为用户的数据源。

我有 2 个问题要问:

1) 一旦User.Create() 被执行,下面的模型结构就会存储在数据库中并作为响应发送给客户端。

{
  "id": "RMQ1dC03Ws8swaxPNvqKLPXEbOw6PcKYPisjsQgOuPmqmqJ0hEJKNzsjROppQAHy",
  "ttl": 86400,
  "created": "2015-08-17T18:18:56.158Z",
  "userId": "55d2259032786ce55eeed0fca",
  "user": {
    "email": "somemail@gmail.com",
    "id": "55d2259032786ce55eeed0fca"
  }
}

id 字段是 accessTokenuserId 是针对用户的标识符。 ttl 指定令牌的过期时间,默认为 2 周,但如果我 User.login() 任何时候,都会生成不同的 accessToken。

我应该如何根据 URL 中提供的任何 accessToken 验证任何用户请求?

2) 我想创建一个superUseradmin 用户来访问任何用户的所有accessTokens,默认情况下该权限被拒绝。为此,我在引导脚本中使用role admin 创建了一个用户:

module.exports = function(app) {
    var role = app.models.Role;
    var roleMapping = app.models.RoleMapping;
    app.models.User.login({email: 'somemail@gmail.com', password: '124154'}, function(err, accessToken) {
                    if (err) return console.error(err);
                    console.log(accessToken);
                    role.create({
                        name:'admin'
                    }, function(err, rtnRole){
                        if (err) {
                          console.log('role error');
                          return console.error(err);
                      }
                      rtnRole.principals.create({
                          principalType: roleMapping.USER,
                          principalId: accessToken.userId
                      }, function(err, principal){
                          if (err) return console.error(err);
                          console.dir(principal);
                      });
                    });
                });

};

输出:

{ principalType: 'USER',
  principalId: '55d168c82de07a275c07921f',
  roleId: 1,
  id: 1 }

...这个用户仍然没有获得访问令牌的授权。我应该如何获得管理员控制权?并使用令牌验证任何用户请求?

更新

按照@Thibault 提供的步骤,我可以为管理员生成acl。这就是我的model.json 现在的样子:

{
  "name": "BudUser",
  "base": "User",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "email": {
      "type": "string",
      "required": true,
      "index": {
        "unique": true
      }
    },
    "number": {
      "type": "string"
    }
  },
  "validations": [],
  "relations": {},
  "acls": [
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "ALLOW",
      "property": "requestCode"
    },
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "ALLOW",
      "property": "loginWithCode"
    },
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "admin",
      "permission": "ALLOW"
    }
  ],
  "methods": {}
}

如何查询https://nodews-somedomain.c9.io:443/api/BudUsers/id/accessTokens获取用户的所有accessToken?以及如何验证如下所示的用户请求:

https://nodews-faizanjehangir.c9.io:443/api/BudUsers/getList?accessToken=214392174214jh21hgj12g4

另外,我应该担心令牌的生成和到期吗?我应该将它们存储在数据库中吗?

【问题讨论】:

  • 你能在 /common/models/model.json 中显示管理员角色的 ACL 吗?

标签: node.js mongodb authentication loopbackjs strongloop


【解决方案1】:

你要玩ACL,别忘了使用生成器:

slc loopback:acl

  • 选择要应用 ACL 条目的模型:所有现有模型
  • 选择 ACL 范围:所有方法和属性
  • 选择访问类型:全部(匹配所有类型)
  • 选择角色:(自定义)> admin
  • 选择要应用的权限:明确授予访问权限

如果我记得 AccessToken 是一个内置模型,您必须为您的特定角色“覆盖”默认 acl 并确保该角色具有优先级。

别忘了使用 debug:loopback* 你会看到发生了什么(尤其是角色的分数)。

【讨论】:

  • 我已经按照步骤,生成了acl..请参考问题中提供的更新..
猜你喜欢
  • 2017-11-22
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 2018-05-02
  • 2020-04-13
  • 1970-01-01
  • 2019-11-08
  • 2014-02-17
相关资源
最近更新 更多