【问题标题】:Devise + OmniAuth Instagram: Not found. Authentication passthru设计 + OmniAuth Instagram:未找到。身份验证通道
【发布时间】:2014-04-29 21:03:16
【问题描述】:

所以我在这个网站上发现了类似的问题,但并没有真正直接解决我所看到的这个问题。

我正在使用带有设计的omniauth-instagram 和omniauth-facebook 并收到以下错误(使用两个提供商)。

网址: http://localhost:3000/users/auth/callbacks/facebook
错误:Not found. Authentication passthru.

以下是我的 callbacks_controller.rbuser.rbroutes.rb 的示例——任何正确方向的有用提示都是非常感激。如果我应该提供任何其他信息,请告诉我!

callbacks_controller.rb

class Users::Auth::CallbacksController < Devise::OmniauthCallbacksController

  def instagram

      # You need to implement the method below in your model (e.g. app/models/user.rb)
      @user = User.find_for_oauth(request.env["omniauth.auth"], current_users)

      if @user.persisted?
        sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
        set_flash_message(:notice, :success, :kind => "Instagram") if is_navigational_format?
      else
        session["devise.instagram_data"] = request.env["omniauth.auth"]
        redirect_to new_user_registration_url
      end

  end




  def facebook

      # You need to implement the method below in your model (e.g. app/models/user.rb)
      @user = User.find_for_oauth(request.env["omniauth.auth"], current_users)

      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

user.rb

class User < ActiveRecord::Base

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  devise  :omniauthable, :omniauth_providers => [:instagram, :facebook]

  def self.find_for_oauth(auth, signed_in_resource = nil)

    # Get the identity and user if they exist
    identity = Identity.find_for_oauth(auth)
    user = identity.user

    if user.nil?

      # Get the existing user from email if the OAuth provider gives us an email
      user = User.where(:email => auth.info.email).first if auth.info.email

        # Create the user if it is a new registration
        if user.nil?
          user = User.new(
            name: auth.extra.raw_info.name,
            #username: auth.info.nickname || auth.uid,
            email: auth.info.email.blank? ? TEMP_EMAIL : auth.info.email,
            password: Devise.friendly_token[0,20]
          )
          user.skip_confirmation!
          user.save!
        end

        # Associate the identity with the user if not already
        if identity.user != user
          identity.user = user
          identity.save!
        end

    end

    user


  end
end

routes.rb
devise_for :users, :controllers =&gt; { :omniauth_callbacks =&gt; "users/auth/callbacks" }

【问题讨论】:

    标签: ruby-on-rails ruby facebook ruby-on-rails-3 devise


    【解决方案1】:

    您是否在devise.rb 中添加了两者?

      # devise.rb
      # ...
    
      # ==> OmniAuth
      # Add a new OmniAuth provider. Check the wiki for more information on setting
      # up on your models and hooks.
      # config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo'
    
      config.omniauth :facebook, "KEY", "SECRET"
      config.omniauth :instagram, "KEY", "SECRET"
    

    【讨论】:

      【解决方案2】:

      配置策略后,您需要使模型(例如 app/models/user.rb)omniauthable:

      设计 :omniauthable, :omniauth_providers => [:facebook, :instagram]

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 2021-09-21
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      相关资源
      最近更新 更多