我相信花了很多时间来为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
字段为accessToken
,userId
是针对用户的标识符。 ttl
指定令牌的到期时间,默认为2周,但如果我User.login()
,则会生成不同的accessToken。
如何针对网址中提供的任何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 }
...此用户仍未获得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
另外,我应该担心代币生成和到期吗?我应该将它们存储在数据库中吗?
答案 0 :(得分:1)
你必须使用ACL,不要忘记使用生成器:
slc loopback:acl
如果我记得AccessToken是内置模型,则必须“覆盖”特定角色的默认acl,并确保此角色具有优先级。
不要忘记使用debug:loopback *你会看到发生了什么(特别是角色的得分)。