我已经将自己的登录功能写入了验证用户名/密码的服务,我希望仍然使用LoopBacks用户模型。问题是获取一个accessstoken(并保持用户登录LB应用程序)我需要提供密码。在Loopbacks数据源中存储密码不是一种选择。我的问题是,如何告诉Loopback用户实际已经过验证并且无需密码即可登录?从我在User.Login代码中看到的,没有跳过密码的选项,只是登录用户。
这是以编程方式完成的,我使用的是以用户模型为基础的自定义用户模型。以下是一个简化示例:
{{1}}
答案 0 :(得分:2)
不确定这是否是最佳做法,但我实际上会为custom-user.js
添加自定义登录入口点:
CustomUser.customLogin = function (email, cb) {
var tokenTimeToLive = 12096000; //in ms
CustomUser.findOne({
where: {email: email}
}, function (err, user) {
if (err) {
return cb(err, null);
} else {
if (user) {
user.createAccessToken(tokenTimeToLive, function (error, token) {
return cb(error, token);
});
} else {
return cb(new Error("No User found"), null);
}
}
});
};
CustomUser.remoteMethod('customLogin', {
accepts: {arg: 'email', type: 'string', required: true},
returns: {arg: 'credentials', type: 'object', root: true},
description: "Custom login entry"
});
custom-user.json
中的此方法的自定义ACL:
...
"acls": [
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
},
{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
},
{
"accessType": "WRITE",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
},
{
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW",
"property": "customLogin"
}
]
...
当然,您可能希望使用除email
之外的其他字段,但我认为它也是Loopback User
模型的主键。
但是,当您发布新密码时,您将始终需要为用户发布以编程方式生成的密码。