@eliastro

[Rails] Devise Omniauth + Vkontakte. При попытке залогиниться «Not found. Authentication passthru.» В чем дело?

Здравствуйте!
Делаю аутентификацию через вконтакте. Использую гемы devise, omniauth, omniauth-vkontakte.
Когда кликаю на ссылку залогиниться через вконтакте, выходит сообщение-страница (localhost:8080/users/auth/vkontakte.user):
"Not found. Authentication passthru."

В инициализации devise.rb :
config.omniauth :vkontakte, 'APP_ID', 'APP_SECRET'
где 'APP_ID', 'APP_SECRET' - значения полученные при регистрации приложения на сервере вконтакте
модель user.rb :
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable,
         :omniauthable, omniauth_providers: [:vkontakte]
  attr_accessor :email, :password, :password_confirmation, :remember_me
  attr_accessor :nickname, :provider, :url, :username         
 
  def self.find_for_vkontakte_oauth access_token
    if user = User.where(:url => access_token.info.urls.Vkontakte).first
      user
    else 
      User.create!(:provider => access_token.provider, :url => access_token.info.urls.Vkontakte, :username => access_token.info.name, :nickname => access_token.extra.raw_info.domain, :email => access_token.extra.raw_info.domain+'<hh user=vk>.com', :password => Devise.friendly_token[0,20]) 
    end
  end

контроллер users/ominiauth_callbacks_controller.rb :
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  include Devise::Controllers::Rememberable
  
  def facebook
  end

  def vkontakte
    @user = User.find_for_vkontakte_oauth request.env["omniauth.auth"]
    if @user.persisted?
      remember_me(@user)
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Vkontakte"
      sign_in_and_redirect @user, :event => :authentication
    else
      flash[:notice] = "authentication error"
      redirect_to root_path
    end    
  end

  def passthru
    super    
  end
end


routes.rb :
devise_for :users, controllers: { omniauth_callbacks: "users/omniauth_callbacks" }


собственно сама ссылка залогиниться через вконтакте:
<%- if devise_mapping.omniauthable? %>
  <%- resource_class.omniauth_providers.each do |provider| %>
    <%= link_to "Sign in with #{provider.to_s.titleize}", user_omniauth_authorize_path(resource_name, provider:provider) %><br />
  <% end -%>
<% end -%>


ruby '2.1.4'
rails '4.1.6'
  • Вопрос задан
  • 4457 просмотров
Решения вопроса 1
viktorvsk
@viktorvsk
В поиске довольно много ответов по этой проблеме. Ни один не подошел?
Где пишут, что рестарт надо делать, где - что это легаси омниауса.

Свиду, вроде, все правильно, но:
1. Что за ссылка localhost:8080/users/auth/vkontakte.user ? Обычно она выглядит как localhost:8080/users/auth/vkontakte
2. Для чего аттр_акссессоры у юзера?
3. Почему идентифицируете пользователя по ссылке, а не по паре провайдер+uid ? Люди любят менять никнеймы
4. Это опечатка?
resource_name, provider:provider

provider передается как параметр, а не как часть хэша. Вот скопировал из своего рабочего проекта:
link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы