获取用户访问令牌并验证请求

时间:2015-08-20 21:12:48

标签: node.js mongodb authentication loopbackjs strongloop

我相信花了很多时间来为NodeJS的strongloop REST框架解码这个pendora盒子。我已成功设法按照教程设置two factor authentication模块。这工作正常,mongo设置为用户的数据源。

我有两个问题要问:

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。

如何针对网址中提供的任何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 }

...此用户仍未获得accessstokens的授权。我应该如何获得管理员控制权?并使用令牌验证任何用户请求?

更新

按照@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

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

User not authorized

1 个答案:

答案 0 :(得分:1)

你必须使用ACL,不要忘记使用生成器:

slc loopback:acl

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

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

不要忘记使用debug:loopback *你会看到发生了什么(特别是角色的得分)。