Rails API: аутентификация пользователей из мобильных приложений с использованием имени пользователя/пароля или токена facebook

Итак, я уже несколько дней вытаскиваю свои волосы, пытаясь понять, как добавить аутентификацию имени пользователя и пароля в мой API-интерфейс rails.

Вот краткий обзор моего текущего потока аутентификации:

enter image description here

  • Пользователь выбирает "login with Facebook" на мобильном клиенте, клиенте перенаправляет на приложение Facebook и запрашивает access_token

  • В случае успеха Facebook отвечает токеном доступа и клиентом   перенаправляет обратно в мое приложение.

  • Клиент отправляет токен доступа в мой API

  • В моем API используется камень koala, чтобы проверить, действителен ли токен доступа.

  • Если токен действителен, Facebook отправляет данные пользователей в API   где создается новый пользователь. Если пользователь уже существует, мой API отправляет данные пользователей.

Мой API обрабатывает маркер доступа на шаге 4, как показано ниже:

      def self.authenticate_user_from_facebook(fb_access_token)
        user = User.new
        graph = Koala::Facebook::API.new(fb_access_token)
        profile = graph.get_object('me')


        #user['fb_id']    = profile['id']
        #user['fb_token'] = fb_access_token

        # Generate user hash
        uhash = Hash.new
        uhash['provider'] = 'facebook'
        uhash['uid']      = profile['id']

        uhash['info'] = Hash.new
        uhash['info']['nickname']   = profile['username']
        uhash['info']['name']       = profile['name']
        uhash['info']['email']      = profile['email']
        uhash['info']['first_name'] = profile['first_name']
        uhash['info']['last_name']  = profile['last_name']
        uhash['info']['verified']   = profile['verified']

        uhash['info']['urls'] = Hash.new
        uhash['info']['urls']['Facebook'] = profile['link']

        uhash['credentials'] = Hash.new
        uhash['credentials']['token'] = fb_access_token

        uhash['extra'] = Hash.new
        uhash['extra']['raw_info'] = Hash.new



        #Save the new data
        user = User.apply_auth(uhash)
        return user
     end


      def self.apply_auth(uhash)
          User.where(:uid => uhash['uid'], :provider => uhash['provider']).first_or_create do |user|

        user.provider = uhash['provider']
        user.uid      = uhash['uid']
        user.nickname = uhash['info']['nickname']
        user.email    = uhash['info']['email']

        user.name       = uhash['info']['name']
        user.first_name = uhash['info']['first_name']
        user.last_name  = uhash['info']['last_name']
      end
   end

После создания пользователя они могут отправлять запросы на мой API с помощью маркера доступа, как показано ниже:

enter image description here

На шаге 2 API использует koala, чтобы проверить токен доступа пользователей. Это делается путем применения следующего before_filter ко всем контроллерам.

before_filter :current_user

и в моем приложении application_helper.rb

def current_user
    @current_user ||= User.authenticate_user_from_facebook(params[:access_token])
end

Каждый раз, когда пользователь делает запрос на мой API, камень koala используется, чтобы проверить, действительно ли токен, затем обрабатывается запрос.

Теперь я пытаюсь добавить аутентификацию только с именем пользователя и паролем.

Вещи, которые я просмотрел

Я постоянно обращался к Railscast 235, 209, 250, 82 и читал на OAuth2. У меня есть общее представление о том, как работает аутентификация, но у меня возникли проблемы с его применением к текущему потоку аутентификации.

Определить аутентификацию токена Ссылаясь на Railscast 235, 209 и этот пост в блоге: http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/

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

OAuth2 Создание моего API-провайдера OAuth2 похоже на то, что это был бы хороший способ, но кажется глупым перенаправление на браузер, и я не знаю, можно ли перенаправить его обратно из браузера в мое приложение.

Аутентификация с нуля Это вариант, о котором я думаю, но я бы изобрел колесо.

Спасибо, что прочитал этот длинный пост! Любые советы приветствуются!

Ответ 1

Вы можете посмотреть Warden. Warden упрощает настройку и использование разных стратегий auth, используете ли вы токены, пароль или Facebook. Он основан на стойке, поэтому он также работает за пределами Rails, что приятно, если вы когда-либо захотите использовать что-то вроде Grape для API.

Вот RailsCast on Warden. (Требуется подписка Pro)