devise + omniauth выход из системы

Я, наконец, получил «войти через Facebook» для работы с devise/omniauth, но когда пользователь вошел в систему, ссылка «войти через Facebook» не меняется на «выйти» и/или нет видимого выхода вариант.

вот мой файл route.rb

devise_for :users, :controllers => {:omniauth_callbacks => "users/omniauth_callbacks", :registrations => 'registrations'}, :path_names => { :sign_in => 'login', :sign_out => 'logout' } do
  get 'login' =>'devise/sessions#new', :as => :new_user_session
  post 'login' => 'devise/sessions#create', :as => :user_session
  get 'signup'  => 'registrations#new', :as => :new_user_registration
  get 'signout' => 'devise/sessions#destroy', :as => :destroy_user_session

конец

а вот файл пользователя

class User < ActiveRecord::Base
devise :omniauthable, :omniauth_providers => [:facebook]
def self.find_for_facebook_oauth(auth, signed_in_resource=ni)
user = User.where (:provider => auth.provider, :uid => auth.uid).first
unless user

def self.find_for_facebook_oauth(auth, signed_in_resource=nil)
user = User.where
user = User.create(name:auth.extra.raw_info.name,
                     provider:auth.provider,
                     uid:auth.uid,
                     email:auth.info.email,
                     password:Devise.friendly_token[0,20]
                     )
end
user
end

end

контроллер сеанса:

class SessionsController < ApplicationController
def create
 user = User.from_omniauth(env["omniauth.auth"])
 session[:user_id] = user.id
 redirect_to root_path
 end

def destroy
 session.delete[:user_id] = nil
 redirect_to root_path
end
end

Omniauth_callbacks_controller:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
# You need to implement the method below in your model (e.g. app/models/user.rb)
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

if @user.persisted?
  sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not       activated
  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
end

и, наконец, макет приложения

<% if current_user %>
      Signed in as <strong><%= current_user.name %></strong>!
      <%= link_to "Sign out", destroy_user_session, id: "sign_out" %>
    <% else %>
  <li><%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %></li>
  <% end %>

Не совсем уверен, что я продолжаю делать неправильно или почему мне трудно найти ответ, поэтому я подумал, что может быть проще просто разместить код. Я новичок в этом, поэтому любая помощь приветствуется. Спасибо!


person user3130910    schedule 04.01.2014    source источник
comment
Будете ли вы публиковать свой контроллер users/omniauth_callbacks?   -  person ruevaughn    schedule 05.01.2014
comment
Если бы вы могли отредактировать свой исходный ответ и добавить этот код внизу, это было бы намного лучше. Кроме того, укажите модель пользователя, так как она вызывается User::OmniauthCallbackController.   -  person ruevaughn    schedule 06.01.2014
comment
попался, обновился! это действительно основной вопрос, но где я могу найти пользовательскую модель?   -  person user3130910    schedule 06.01.2014
comment
Вы найдете модели, расположенные в app/models, поэтому пользовательская модель будет в app/models/user.rb.   -  person ruevaughn    schedule 10.01.2014
comment
хорошо, модель пользователя — это второй набор кода выше — я думаю, что часть ominauth работает, поскольку она подключается к facebook — может быть, проблема в том, как omniauth работает с devise? Должен ли я настроить devise отдельно при запуске omniauth + devise? я этого не делал, потому что в вики omniauth git не упоминалось, что я должен был это сделать...   -  person user3130910    schedule 11.01.2014


Ответы (1)


Краткий ответ - current_user равен нулю, поэтому вы на самом деле не вошли в систему.

Если «Войти через Facebook» по-прежнему отображается, а «Выйти» не отображается, я предполагаю, что «Войти как» также не отображается.

Скорее всего, это связано с тем, что этот current_user не установлен, поэтому эта строка не работает.

<% if current_user %>

и поэтому этот код срабатывает

<li><%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %></li>

Итак, я предполагаю, что current_user на самом деле не устанавливается, поэтому вы на самом деле не вошли в систему. Вы можете добавить фильтр контроллера устройства authenticate_user!, чтобы увидеть, вошли ли вы в систему или нет. Что-то типа

class ApplicationController
  before_filter :authenticate_user!
end

Который перенаправит вас, если вы не вошли в систему.

Используйте Pry, чтобы узнать

Pry — отличный инструмент для отладки подобных вещей.

Для отладки с помощью pry вы должны добавить в свой Gemfile

group :development do
  gem "pry", "~> 0.9.12.4"
end

и запустить bundle install

затем вы можете добавить это в свой код

<%= binding.pry %>
<% if current_user %>
  Signed in as <strong><%= current_user.name %></strong>!
  <%= link_to "Sign out", destroy_user_session, id: "sign_out" %>
<% else %>
  <li><%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %></li>
<% end %>

Пройдите обычный рабочий процесс Login with Facebook, и сервер Rails в вашем терминале «остановится» на `‹%binding.pry%> и позволит вам выполнять команды, включая проверку переменных.

В терминале, в котором работает ваша консоль rails, вы должны увидеть что-то вроде

current_user ? "There is a current user set" : "No current user is set"

Вы также можете просто запустить

current_user

но первый имеет более подробный вывод. Некоторые другие полезные команды отладки включают

help whereami exit !!!

person ruevaughn    schedule 04.01.2014
comment
спасибо за ответ, @ruevaughn! ну, так что, когда я впервые вошел в систему, мне потребовалось Facebook, чтобы проверить и аутентифицировать, что я хочу войти в систему с Facebook ... так это означает, что это сработало или не сработало? как мне установить пользователя, если он не установлен? - person user3130910; 06.01.2014
comment
Этот экран означает, что вы все правильно настроили для общения с Facebook, но не означает, что после этого все пошло наперекосяк. Я думаю, у вас есть синтаксическая ошибка в вашем User::OmniauthCallbacksController, возможно, где-то здесь: User.find_for_facebook_oauth(request.env[omniauth.auth], current_user)** - person ruevaughn; 06.01.2014
comment
sign_in_and_redirect @user — это то, что должно использоваться для входа в систему и установки current_user - person ruevaughn; 06.01.2014