Google OAuth 2.0和Devise - "错误" :" redirect_uri_mismatch"

时间:2015-11-19 15:17:50

标签: ruby-on-rails devise omniauth

我已将Devise配置为使用 omniauth FacebookGoogle。它适用于Facebook,但我遇到Google的问题。

我一次又一次地得到这个错误:

  

错误 - omniauth:(google_oauth2)身份验证失败! invalid_credentials:OAuth2 :: Error,redirect_uri_mismatch:

     

{"错误" :" redirect_uri_mismatch"}

     

[localhost] [127.0.0.1] [6a9377fe-d0b3-42]       RuntimeError - 无法找到路径的有效映射" / users / auth / google_oauth2 / callback":

     

设计(3.5.2)lib / devise / mapping.rb:49:在`find_by_path!'

我在Google控制台中尝试了多个URI,但是任何人似乎都没有工作:

Google Console

的Gemfile

# Social Networks Authentification
gem 'omniauth'
gem 'omniauth-facebook'
gem 'omniauth-google-oauth2'

devise.rb

config.omniauth :facebook, ENV['OAUTH_FACEBOOK_ID'], ENV['OAUTH_FACEBOOK_SECRET'],
                       scope: 'public_profile', image_size: {height: 1600}, info_fields: 'name, id, first_name, last_name, gender, hometown, cover, email, link' # list of permissions

# Not working, "error" : "redirect_uri_mismatch"
config.omniauth :google_oauth2, ENV['OAUTH_GOOGLE_ID'], ENV['OAUTH_GOOGLE_SECRET']

omniauth_callbacks_controller.rb

def self.provides_callback_for(provider)
    class_eval %Q{
      def #{provider}
        @user = User.find_for_oauth(env["omniauth.auth"], current_user)

        if @user.persisted?
          handle_redirect("devise.#{provider}_uid", "#{provider}".capitalize)
        else
          session["devise.#{provider}_data"] = env["omniauth.auth"]
          redirect_to new_user_registration_url
        end
      end
    }
  end

  [:facebook, :google_oauth2].each do |provider|
    provides_callback_for provider
  end

  def handle_redirect(_session_variable, kind)
    # here we force the locale to the session locale so it siwtches to the correct locale
    I18n.locale = session[:omniauth_login_locale] || I18n.default_locale
    sign_in_and_redirect @user, event: :authentication
    set_flash_message(:notice, :success, kind: kind) if is_navigational_format?
  end

omniauth_controller.rb

class OmniauthController < ApplicationController
  def localized
    # Just save the current locale in the session and redirect to the unscoped path as before
    session[:omniauth_login_locale] = I18n.locale
    redirect_to user_omniauth_authorize_path(params[:provider])
  end
end

的routes.rb

  devise_for :users, skip: [:session, :password, :registration, :confirmation], controllers: { omniauth_callbacks: 'omniauth_callbacks' }


  localized do

    get 'auth/:provider' => 'omniauth#localized', as: :localized_omniauth

    devise_for :users, :path => 'accounts', skip: :omniauth_callbacks, :controllers => {sessions: 'sessions', registrations: 'registrations', passwords: 'passwords'}

end

user.rb

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

我在本地生产中都遇到了问题。

有人能帮帮我吗?我真的不知道还能做些什么。

3 个答案:

答案 0 :(得分:6)

好吧,终于找到了问题所在......

'omniauth-google-oauth2' gem仅适用于'omniauth-oauth2' gem的版本1.3.1。

所以我改变了我的Gemfile:

# Social Networks Authentification
gem 'omniauth-oauth2', '~> 1.3.1' # Don't touch that unless you don't want Google omniauth to work!
gem 'omniauth-twitter'
gem 'omniauth-facebook'
gem 'omniauth-linkedin'
gem 'omniauth-google-oauth2' # Works only with omniauth-oauth2 v 1.3.1

现在一切正常!

有关详细信息,请参阅this thread

答案 1 :(得分:1)

请检查以下步骤以解决问题

步骤1。错误:redirect_uri_mismatch,因为以下错误,请复制以下链接文本请求中的重定向URI http://yourlinks:3000/与授权给OAuth客户端的URI不匹配。访问...

第二步。登录Google Console Api,转到凭据,选择您的Api并通过以上链接到授权重定向URI部分

步骤3。保存并再次测试

谢谢。

答案 2 :(得分:1)

我有同样的问题,我犯了很多错误,我按照以下步骤纠正了这些错误:

  1. 首先检查Google凭据中的重定向网址是否正确
  2. 然后检查&#34; omniauth-google-oauth2&#34;的版本,更改此gem的版本对我有效。
  3. Gemfile包含

    gem "gmail"
    gem "omniauth-google-oauth2"