Rails: как аутентифицировать пользователя на мобильном устройстве с помощью Devise+Omni-facebook+Devise_token_auth после получения токена доступа

Как использовать токен доступа facebook на Devise + Omniauth-facebook + Devise_token_auth?

Есть ли способ каким-то образом подключить токен доступа к omniauth-facebook и заставить пользователя зарегистрироваться/войти в систему? Или любое другое решение приветствуется.

Я могу получить токен доступа из facebook graph API на своей мобильной стороне.

Я попытался поместить токен доступа в URL-адрес обратного вызова как таковой: /omniauth/facebook/callback?code=ACCESS_TOKEN, но он просто возвращает {"errors":["Используйте POST /sign_in для входа в систему. GET не поддерживается. "]}

Я посмотрел:

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

Предлагаемое решение посмотреть на Warden, но я не думаю, что это должно быть так сложно.

omniauth для аутентификации rails и ios

Предлагаемое решение — гем, но гем больше не поддерживается.

Вход Rails Devise OmniAuth через Facebook с iOS

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


person Hahn Dong    schedule 13.06.2016    source источник


Ответы (1)


Я решил попробовать что-то, и это, кажется, работает.

Я взял коды у @JeremyMoyers здесь. Это действительно специальное решение, но, похоже, оно помогает.

Я перезаписал действие контроллера DeviseTokenAuth для omniauth_success:

Маршруты:

config/routes.rb

namespace :api do
  scope :v1 do
    # mount_devise_token_auth_for 'User', at: 'auth'
    mount_devise_token_auth_for 'User', at: 'auth', controllers: {
      omniauth_callbacks: 'omniauth_callbacks',
      }
  end
end

Контроллер:

app/controllers/omniauth_callbacks_controller.rb

class OmniauthCallbacksController < DeviseTokenAuth::OmniauthCallbacksController

  def omniauth_success
  # get_resource_from_auth_hash
  # Remove original get_resource_from_auth_hash and implement custom get_resource
  get_resource_from_uhash(params[:access_token],params[:expires_in])
  create_token_info
  set_token_on_resource
  create_auth_params

  # Skip confirmation is done at custom get_resource
  # if resource_class.devise_modules.include?(:confirmable)
  # don't send confirmation email!!!
  # @resource.skip_confirmation!
  # end

  sign_in(:user, @resource, store: false, bypass: false)

  if @resource.save!
    update_auth_header
    yield @resource if block_given?

    redirect_to @resource
    # render_data_or_redirect('deliverCredentials', @auth_params.as_json, @resource.as_json)
  else
    redirect_to rooth_path
  end
  end

protected
  def get_resource_from_uhash(access_token, expires_in)
  graph = Koala::Facebook::API.new(access_token)
  profile = graph.get_object('me?fields=email,name,id,picture')
  # logger.info(profile)
  @resource = User.where({
    uid:      profile['id'],
    provider: 'facebook'
    }).first_or_initialize do |user|
      user.provider = 'facebook'
      user.uid = profile['id']
      user.name = profile['name']
      user.oauth_token = access_token
      user.password = Devise.friendly_token[0,20]
      user.image = profile['picture'] if profile['picture'].present?
      user.oauth_expires_at = Time.at(expires_in)
      user.skip_confirmation!
      user.save!
    end

  if @resource.new_record?
    @oauth_registration = true
    set_random_password
  end
  @resource
  end
end

Дайте мне знать, если есть какие-либо проблемы безопасности для этого.

person Hahn Dong    schedule 15.06.2016