Omniauth-facebook с Devise: отсутствующие ошибки сквозного доступа

У меня установлена ​​аутентификация Devise без проблем. Теперь я пытаюсь добавить возможность входа в систему через Facebook, используя Omniauth-facebook.

Я следовал инструкциям в этом руководстве, но получаю сообщения об ошибках отсутствует документация «Passthru» при посещении URL-адреса localhost:3000/auth/facebook.

Вот первая ошибка, которую я получил:

Unknown action
The action 'passthru' could not be found for RegistrationsController

Я попробовал исправить бинт, просто добавив пустое действие «passthru» в свой контроллер:

def passthru
end

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

Template is missing
Missing template registrations/passthru, devise/registrations/passthru, devise/passthru, application/passthru with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in: * "/home/user/project/app/views" * "/home/user/.rvm/gems/ruby-2.0.0-p648@railstutorial_rails_4_0/gems/devise-3.5.2/app/views"

Я попытался создать «passthru.html.erb» в указанных папках, но эта ошибка осталась. В любом случае, я думаю, что эти ошибки символизируют более глубокую проблему.

Кто-нибудь еще столкнулся с этой проблемой? Все, что я смог найти, это этот ТАК вопрос, но ни один из ответов не был полезным.


Мой код на данный момент:

Gemfile

gem 'devise'
gem 'omniauth-facebook'
gem 'omniauth'

routes.rb

devise_for :members, controllers: { Registrations: 'registrations', omniauth_callbacks: 'registrations' }

member.rb

  devise :database_authenticatable, :registerable,
         :omniauthable, :omniauth_providers => [:facebook]


  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |member|
      member.email = auth.info.email
      member.password = Devise.friendly_token[0,20]
      member.title = auth.info.name
    end
  end

registrations_controller.rb

  def facebook
    @member = Member.from_omniauth(request.env["omniauth.auth"])
    if @member.persisted?
      sign_in_and_redirect @member, :event => :authentication
      set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_member_registration_url
    end
  end

  def failure
    redirect_to root_path
  end

  def passthru
  end

инициализаторы/devise.rb

config.omniauth :facebook, "<app_id>", "<app_secret>"

person Joe Morano    schedule 25.05.2016    source источник
comment
Пожалуйста, опишите, чего вы пытаетесь достичь методом passthru?   -  person Pravesh Khatri    schedule 25.05.2016
comment
@PraveshKhatri Я не хочу ничего с этим делать. В документации ничего не говорится о сквозном доступе. Я думаю, что это пережиток старой версии omniauth.   -  person Joe Morano    schedule 25.05.2016


Ответы (4)


Попробуй это :

Обновить GemFile:

gem 'omniauth-facebook'
gem 'omniauth'

Перейти к rails_apps/yourapp/config/initializers/devise.rb

Devise.setup do |config|
   config.omniauth :facebook, "KEY", "SECRET"
 end

Обновите модель пользователя

class User < ActiveRecord::Base

         devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable,
    :omniauthable, :omniauth_providers => [:facebook]

     def self.from_omniauth(auth)
         where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
           user.provider = auth.provider
           user.uid = auth.uid
           user.email = auth.info.email
           user.password = Devise.friendly_token[0,20]
         end
     end
    end

Перейти к: rails_apps/yourapp/config/routes.rb

Rails.application.routes.draw do
  devise_for :users
  resources :users
end

Редактировать в представлении

 <%= link_to "Sign in with Facebook", "/auth/facebook", id: "sign_in" %>
person vipin    schedule 31.05.2016

Passthru - это реликвия от omniauth, обновите свои геммы devise omniauth и так далее. есть контроллер с именем omiauth_callback, он шумит ;P. (может помочь вам отследить источник проблемы)

Если вы создаете метод в контроллере следующим образом: def passthru end Вы ДОЛЖНЫ создать представление (даже пустое) или перенаправление: вдохновитесь методами ajax, чтобы обойти рендеринг html. Надеюсь, это направит вас по пути решения проблем.

попробуйте также эти маршруты: ``` user_omniauth_authorize /users/auth/:provider(.:format) session#passthru {:provider=>/facebook|twitter|google/}

user_omniauth_callback /users/auth/:action/callback(.:format) session#(?-mix:facebook|twitter|google) ```

person plombix    schedule 30.05.2016
comment
Я только что написал gem «omniauth-facebook», и это было около недели назад, так что не должен ли я автоматически получать последнюю версию? - person Joe Morano; 31.05.2016
comment
Humm зависит от Gemfile.lock, проверьте этот файл и, если необходимо: gem upgrade gem_name. Кстати: проход по умолчанию; рендеринг :layout =› false ; конец - person plombix; 31.05.2016
comment
``` user_omniauth_authorize /users/auth/:provider(.:format) session#passthru {:provider=›/facebook|twitter|google/} user_omniauth_callback /users/auth/:action/callback(.:format) session#( ?-mix:facebook|twitter|google). ``` - person plombix; 31.05.2016

Вы можете создать еще один контроллер для Omniauth callback

class OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def facebook
    @user =  User.from_omniauth(request.env['omniauth.auth'])
    if @user.persisted?
      sign_in_and_redirect @user, :event => :authentication 
      set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end


  def after_sign_in_path_for(resource)
    super resource
  end

end

вам нужно сбросить ваши маршруты как

devise_for :members, :controllers => {:registrations => "members/registrations", :omniauth_callbacks => 'omniauth_callbacks'}

Насколько я помню, вам не нужно использовать :omniauth_providers => [:facebook] в вашем member.rb

Теперь вы можете добавить кнопку в свой sign_up page или вместо этого включить приведенный ниже код в свой devise/shared/_links.html.erb, потому что он также будет доступен в вашей форме входа.

<%- if devise_mapping.omniauthable? %>
  <%- resource_class.omniauth_providers.each do |provider| %>
    <%= link_to "Sign up with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider), class: "btn btn-default navbar-btn" %><br />
  <% end -%>
<% end -%>

вам также необходимо настроить devise в инициализаторах

В вашем /config/initializers/devise.rb

config.omniauth :facebook, "App ID", "App Secret", scope: 'email', info_fields: 'email,name'

Пожалуйста, ознакомьтесь с этим простейшим руководством по Sing_up с Facebook Link< /а>

person Pravesh Khatri    schedule 25.05.2016
comment
Вы уверены, что мне нужен отдельный контроллер для обратного вызова Omniauth? Какая разница, в каком контроллере он находится, если маршрут указывает на правильный? - person Joe Morano; 25.05.2016
comment
да, вы можете сделать это в том же контроллере, но я обычно делаю это в другом контроллере, так как это дает мне понять, что если мне нужно включить регистрацию в других социальных сетях, таких как Twitter, LinkedIn и т. д., тогда это не создаст беспорядка в мой регистрационный контроллер. - person Pravesh Khatri; 25.05.2016
comment
Да, так что я думаю, что кроме этого, у меня есть тот же код, который вы разместили. - person Joe Morano; 26.05.2016

Попробуй это .........

config/initializers/devise.rb

config.omniauth :facebook, ENV["FACEBOOK_KEY"], ENV["FACEBOOK_SECRET"], { :scope => 'email, offline_access'}

config/routes.rb

devise_for :members, controllers: { registrations: 'registrations', omniauth_callbacks: "omniauth_callbacks" }

app/models/member.rb

devise :database_authenticatable, :registerable,
      :recoverable, :rememberable, :trackable, :validatable, :omniauthable


def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |member|
    member.email = auth.info.email
    member.password = Devise.friendly_token[0,20]
    member.title = auth.info.name
  end
end 

приложение/контроллеры/omniauth_callbacks_controller.rb

  skip_before_filter :authenticate_user!

  def facebook
    p env["omniauth.auth"]
    user = User.from_omniauth(env["omniauth.auth"])
    if user.persisted?
      flash[:notice] = "You are in..!!!"
      sign_in_and_redirect(user)
    else
      session["devise.user_attributes"] = user.attributes
      redirect_to new_user_registration_url
    end
  end

  def failure
    #handle you logic here..
    #and delegate to super.
    super
  end

Надеюсь, это сработает для вас.

person Akshay Borade    schedule 27.05.2016
comment
Какая разница в нашем коде, которая, по вашему мнению, может быть причиной моей ошибки? Я не могу найти никакой существенной разницы. - person Joe Morano; 27.05.2016