jwt-аутентификация на клиентском iOS-сервере nodejs через сторонний аутентификатор

Я пытаюсь обернуть голову, используя аутентификацию на основе json webtoken (jwt) на сервере, связанном с использованием третьей стороны (например, Google) для аутентификации пользователя. Первоначально мне удалось создать свою собственную схему обработки входа и jwt с jsonwebtoken на моем nodejs сервере, но нам нужен клиент, работающий в системе iOS, чтобы взаимодействовать с ним, и мы начали искать решение, где нам не нужно кодировать так много клиентского кода (запрос нового токена по истечении срока действия и т. д.) и подумал, что мы воспользуемся сторонней библиотекой, чтобы сделать это за нас.

Дело в том, что я не нашел ничего, что могло бы сделать это за нас. Я нашел библиотеки, которые могли бы обрабатывать подключение клиента к API Google для клиента, я обнаружил, что идентификация пользователя обрабатывается Google, но не нашел ничего, что могло бы обрабатывать фактическое получение jwt, которое сервер будет, кроме как подлинного пользователя.

Мой вопрос по существу таков: у нас есть клиент iOS и сервер nodejs, и мы хотели бы использовать Google для аутентификации наших пользователей и иметь клиентский вызов api-s на нашем сервере nodejs, при этом большая часть процесса аутентификации обрабатывается какой-либо третьей стороной. библиотека (Google?), как нам к этому подойти?

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


person fbence    schedule 14.12.2016    source источник


Ответы (1)


Часть iOS не готова, но мне удалось использовать Google для аутентификации и авторизации без сеанса в браузере. Идея состоит в том, что клиент входит в систему Google (см. здесь для веб-приложения), и Google любезно предоставит вам токен с логином, который подойдет для сервера. Со стороны nodejs я использовал passport и стратегию google-id-token (см. На github) . Для Google существует довольно много стратегий, но эта работает. Хотя у этого есть недостаток, он не может принять токен в заголовке, но я исправил это в запросе на перенос (см. здесь).

Поскольку у меня была небольшая проблема с тем, как использовать часть User.findOrCreate во всех примерах паспортов, я вставлю здесь свой код, который охватывает полный рабочий пример:

var passport = require('passport');
var GoogleTokenStrategy = require(passport-google-id-token)

passport.use(new GoogleTokenStrategy({
    clientID: config.googleAuth.clientID,
    clientSecret: config.googleAuth.clientSecret,
  },
  function(parsedToken, googleId, done) {
    console.log(parsedToken);
    console.log(googleId);

      User.findOne({ 'google.id': googleId }, function (err, user) {
          if (!user) {
              var testuser = new User({ 
                name: parsedToken.payload.name,
                givenName : parsedToken.payload.givenName,
                familyName : parsedToken.payload.familyName,
                nameunderscore : parsedToken.payload.name.split(' ').join("_"),

              admin: false,
          email: parsedToken.payload.email,
          settings: {save_folder:"default"},
          'google.id' : googleId,
          'google.email' :  parsedToken.payload.email,
          });
        testuser.save(function(err) {})

        }
        return done(err, user);
      });
  }
));

Пользователь приходит из mongodb в отдельный js:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
module.exports = mongoose.model('User', new Schema({ 
    name: String,
    nameunderscore : String,
    givenName: String,

    familyName: String,
    admin: Boolean,
    settings: {
        save_folder: String
        },
    email: String,
    google: {
        id: String,
        email: String
        }
}));

И вот как я добавил стратегию passport к маршрутизатору (обратите внимание, что для сеанса установлено значение false):

var apiRoutes = express.Router();
apiRoutes.use(passport.authenticate('google-id-token',{ session: false }));

Теперь каждый вызов любого маршрута в apiRoutes должен отправляться id_token с действующим токеном Google, чтобы получить доступ.

person fbence    schedule 01.03.2017