Мобильный логин

Я разрабатываю API с петлей и паспортом. Я видел этот пример, и это неплохо:

https://github.com/strongloop/loopback-example-passport

В документации они говорят, что loopback следует этому шагу для аутентификации пользователей через сторонние провайдеры:

  • Посетитель просит войти в систему через Facebook, нажав на ссылку или кнопка, поддерживаемая LoopBack для запуска авторизации oAuth 2.0.
  • LoopBack перенаправляет браузер на конечную точку авторизации Facebook поэтому пользователь может войти в Facebook и предоставить разрешения для LoopBack
  • Facebook перенаправляет браузер на URL-адрес обратного вызова, размещенный в LoopBack с авторизационным кодом oAuth 2.0
  • LoopBack делает запрос на конечную точку токена Facebook, чтобы получить токен доступа с использованием кода авторизации
  • LoopBack использует токен доступа для извлечения пользователя Facebook профиль
  • LoopBack выполняет поиск модели UserIdentity с помощью (provider, externalId) чтобы увидеть, что существует существующий пользователь LoopBack для данного идентификатора Facebook   Если да, установите пользователя LoopBack в текущий контекст   Если нет, создайте пользователя LoopBack из профиля и создайте соответствующую запись в UserIdentity для отслеживания входа сторонней стороны. Установите вновь созданного пользователя в текущий контекст.

Итак, мой вопрос: предположим, что какой-то пользователь получит токен доступа с помощью мобильного приложения, как я могу аутентифицировать запросы пользователей, используя Loopback Passport?

Спасибо

Ответ 1

Я открыл аналогичную тему о той же проблеме, Как интегрировать сторонний логин для андроида. Тогда нашел решение для этого.

Прежде всего, важно сказать, что пользователь loopback может иметь больше токенов доступа в одно и то же время. Когда вы входите в систему со своего веб-сайта или мобильного приложения, loopback каждый раз создает токен доступа.

Если вы запрашиваете доступ к токену, это уже способ сделать это, поэтому вы можете получить токены доступа, используя метод входа в систему, подобный этому

User.login({username: 'foo', password: 'bar'}, function(err, accessToken) {
   console.log(accessToken);
});

Единственное, что вам нужно сделать, это вызвать этот хостинг-метод из вашего приложения для Android. Вы можете использовать loopback android sdk (правильный путь) или отправить имя пользователя и пароль на сервер и обрабатывать, просто так

app.post('/android/custom_login', function(req, res){
    var username = req.body.username;
    var password = req.body.password;

    User.login({username: username , password: password }, function(err, accessToken) {
      console.log(accessToken);
      return res.send(accessToken);
    });
});

Если вы спрашиваете, чтобы войти в систему с учетной записью социальной сети, а затем получить токен доступа, я смогу имитировать несколько вещей из сценария Google. Кроме того, вы можете проверить дополнительные loopback github test

app.post('/android/custom_login', function(req, res){
   var provider = 'google';
   var authSchema = 'oAuth 2.0';

   // oneTimeCode from android
   var oneTimeCode = req.body.oneTimeCode;

   // Make a request to google api
   // to exchange refreshToken and accessToken with using google apis
   var accessToken = 'FROM GOOGLE API';
   var refreshToken = 'FROM GOOGLE API';

   // external id is your google or facebook user id
   var externalId = 'FROM GOOGLE API';
   var email = 'FROM GOOGLE API';

   var credentials = {};
   credentials.externalId = externalId;
   credentials.refreshToken = refreshToken;

   var profile = {};
   profile.id = externalId;
   profile.emails = [{type:'account', value: email}];

   UserIdentityModel.login(
     provider, authSchema, profile, credentials , 
     {autoLogin:true}, function(err, loopbackUser, identity, token){
            if(err) throw err;
            // token is access token for thig login
            return res.send(token);
   });
});

В сценарии google, я получаю одноразовый код, когда пользователь нажал кнопку входа. Затем отправил одноразовый код на мой сервер для обмена с токеном доступа и обновлением токена. Также здесь я получаю информацию о профиле пользователя из Google.

Профиль и поставщик действительно важны, потому что метод UserIdentityModel.login() создает анонимного пользователя с использованием поставщика и profile.id(если эти сведения не существуют)

В конце концов у вас будет токен доступа для приложения для Android, как вы видите

Ответ 2

  • Используйте Пример Loopback-Passport
  • Из server.js замените код следующим образом

    app.get('/auth/account', ensureLoggedIn('/login'), function (req, res, next) {
        res.json(req.accessToken);
    
        });
    
  • Используя accessToken из вышеприведенной строки, вы можете использовать LoopBack API. Вы можете расширить код для создания собственных пользовательских API.