【发布时间】: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 字段是 accessToken,userId 是针对用户的标识符。 ttl 指定令牌的过期时间,默认为 2 周,但如果我 User.login() 任何时候,都会生成不同的 accessToken。
我应该如何根据 URL 中提供的任何 accessToken 验证任何用户请求?
2) 我想创建一个superUser 或admin 用户来访问任何用户的所有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