用户登录时跳过密码

时间:2016-11-14 09:15:50

标签: loopbackjs

我已经将自己的登录功能写入了验证用户名/密码的服务,我希望仍然使用LoopBacks用户模型。问题是获取一个accessstoken(并保持用户登录LB应用程序)我需要提供密码。在Loopbacks数据源中存储密码不是一种选择。我的问题是,如何告诉Loopback用户实际已经过验证并且无需密码即可登录?从我在User.Login代码中看到的,没有跳过密码的选项,只是登录用户。

这是以编程方式完成的,我使用的是以用户模型为基础的自定义用户模型。以下是一个简化示例:

{{1}}

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模型的主键。 但是,当您发布新密码时,您将始终需要为用户发布以编程方式生成的密码。