2016-11-14 4 views
0

Я написал свою собственную функцию входа в службу, которая проверяет имя пользователя/пароль, и я хочу использовать модель пользователя LoopBacks. Проблема заключается в том, чтобы получить accesstoken (и сохранить пользователя, зарегистрированного в LB-приложении), мне нужно указать пароль. Хранение пароля в источнике данных Loopbacks не является вариантом. Мой вопрос, как я могу сказать Loopback, что пользователь на самом деле проверен и может войти в систему без пароля? Из того, что я вижу в коде User.Login, нет возможности пропустить пароль и просто войти в систему.Пропустить пароль при входе пользователя

Все это делается программно, я использую пользовательскую модель, в которой пользовательская модель является базой. Ниже приведен упрощенный пример:

CustomUser.beforeRemote('login', function(ctx, unused, next) { 
    UserService.externalLogin(ctx.args.credentials.username ,ctx.args.credentials.password).then(function(response){ 
     //Go to user.login 
     if(response.authorized){ 
     next(); 
     } 
    }); 
    }); 

ответ

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" 
    }); 

и пользовательский ACL для этого метода в вашем custom-user.json:

... 
"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. Но вам всегда нужно публиковать программно сгенерированный пароль для Пользователей при отправке нового.

+1

Спасибо за решение, F3L1X79, я надеялся обойти часть сгенерированного токена. То, что у меня получилось, - это гибрид этого и все еще использующий функцию входа в систему, где я генерирую токен, если пользователь авторизован. :) – Undrium

Смежные вопросы