2016-12-14 4 views
1

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

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

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

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

ответ

0

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

Поскольку у меня была небольшая проблема, как использовать 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 к маршрутизатору (обратите внимание, что сеанс установлен в ложь):

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

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

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