Google OAuth 2.0 和设计 - "error" : "redirect_uri_mismatch"
Google OAuth 2.0 and Devise - "error" : "redirect_uri_mismatch"
我将 Devise
配置为将 omniauth 与 Facebook
和 Google
一起使用。它适用于 Facebook
但我遇到 Google
.
的问题
我一次又一次地收到这个错误:
ERROR -- omniauth: (google_oauth2) Authentication failure! invalid_credentials: OAuth2::Error, redirect_uri_mismatch:
{"error" : "redirect_uri_mismatch"}
[localhost] [127.0.0.1] [6a9377fe-d0b3-42]
RuntimeError - Could not find a valid mapping for path "/users/auth/google_oauth2/callback":
devise (3.5.2) lib/devise/mapping.rb:49:in `find_by_path!'
我在 Google
控制台中尝试了几个 URI,但似乎都不起作用:
宝石文件
# 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]
我在 local 和 production 中都有问题。
有人可以帮我吗?我真的不知道我还能做什么。
好的,终于找到问题所在了...
'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。
请按照以下步骤解决问题
第一步。错误:redirect_uri_mismatch 如以下错误,复制以下 link 文本 请求中的重定向 URI http://yourlinks:3000/ 与 OAuth 客户端授权的不匹配。访问...
第二步。登录到 Google 控制台 Api,转到凭据,选择您的 Api 并通过上面的 link 到授权重定向 URI 部分
第三步。保存并再次测试
谢谢。
我遇到了同样的问题,我犯了很多错误,我按照以下步骤纠正了这些错误:
- 首先检查 google 凭据中的重定向 url 是否正确,
- 然后检查 "omniauth-google-oauth2" 的版本,更改此 gem 的版本对我有用。
Gemfile 包含
gem "gmail"
gem "omniauth-google-oauth2"
我将 Devise
配置为将 omniauth 与 Facebook
和 Google
一起使用。它适用于 Facebook
但我遇到 Google
.
我一次又一次地收到这个错误:
ERROR -- omniauth: (google_oauth2) Authentication failure! invalid_credentials: OAuth2::Error, redirect_uri_mismatch:
{"error" : "redirect_uri_mismatch"}
[localhost] [127.0.0.1] [6a9377fe-d0b3-42] RuntimeError - Could not find a valid mapping for path "/users/auth/google_oauth2/callback":
devise (3.5.2) lib/devise/mapping.rb:49:in `find_by_path!'
我在 Google
控制台中尝试了几个 URI,但似乎都不起作用:
宝石文件
# 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]
我在 local 和 production 中都有问题。
有人可以帮我吗?我真的不知道我还能做什么。
好的,终于找到问题所在了...
'omniauth-google-oauth2'
gem 仅适用于 'omniauth-oauth2'
gem.
所以我像这样更改了我的 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。
请按照以下步骤解决问题
第一步。错误:redirect_uri_mismatch 如以下错误,复制以下 link 文本 请求中的重定向 URI http://yourlinks:3000/ 与 OAuth 客户端授权的不匹配。访问...
第二步。登录到 Google 控制台 Api,转到凭据,选择您的 Api 并通过上面的 link 到授权重定向 URI 部分
第三步。保存并再次测试
谢谢。
我遇到了同样的问题,我犯了很多错误,我按照以下步骤纠正了这些错误:
- 首先检查 google 凭据中的重定向 url 是否正确,
- 然后检查 "omniauth-google-oauth2" 的版本,更改此 gem 的版本对我有用。
Gemfile 包含
gem "gmail"
gem "omniauth-google-oauth2"