Google devise 和 omniauth 的 oauth2 被处理为失败
Google oauth2 with devise and omniauth processed as failure
我正在尝试配置一个新的 rails4.2 应用程序以针对 Google Oauth2 进行身份验证。
我似乎成功地完成了这个过程,但它被视为失败。
初始授权似乎进行得很顺利,直到 google 发送到回调。然后好像被误判为失败了
给出的错误信息是:
Could not authenticate you from Google because "Invalid credentials".
我已经google寻求解决方案,但无济于事。
是否可以打开额外的日志记录以了解它为什么选择通过失败方法进行处理?
这是请求的日志:
Started GET "/users/auth/google" for 127.0.0.1 at 2016-04-17 09:37:33 +0800
Started GET "/users/auth/google/callback?state=<<state>>&code=<<code>>" for 127.0.0.1 at 2016-04-17 09:37:45 +0800
Processing by Users::OmniauthCallbacksController#failure as HTML
Parameters: {"state"=>"<<state>>", "code"=>"<<code>>"}
Redirected to http://test_app.dev/sign_in
Completed 302 Found in 1ms (ActiveRecord: 0.0ms)
测试的时候,在google提示的时候点了允许,url看起来还不错,为什么会处理成失败了?
config/initializer/devise.rb
config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ['GOOGLE_CLIENT_SECRET'],
:strategy_class => OmniAuth::Strategies::GoogleOauth2,
:name => 'google',
:scope => 'email,profile,contacts',
:access_type => 'offline',
:image_aspect_ratio => 'square'
routes.rb
devise_for :users, :controllers => { omniauth_callbacks: 'users/omniauth_callbacks' }
resources :users
devise_scope :user do
get 'sign_in', :to => 'devise/sessions#new', :as => :new_user_session
get 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session
end
controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def google
logger.debug 'Omniauth callback called' # Never get's called
end
end
application_controller.rb
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
# Direct to user profile after sign in
def after_sign_in_path_for(resource)
user_path(current_user)
end
# Needed by Devise when using omniauth
def new_session_path(scope)
new_user_session_path
end
end
我的宝石:
Using warden 1.2.6
Using devise 3.5.6
Using oauth2 1.0.0
Using omniauth 1.2.2
Using omniauth-oauth2 1.4.0
Using omniauth-google-oauth2 0.4.1
简短的回答是因为你的信誉是错误的。您在配置哈希中的第一个而不是第二个参数上调用 ENV。
更好的答案是..使用更好的捕鼠器。
有时使用 ENV 存储密钥可能会出现问题,您可能没有在启动服务器的同一终端中加载密钥,或者如果您在生产环境中,您可能无法使用查看 ENV 来知道它缺少钥匙。使用机密文件更容易。没关系,rails 正是出于这个原因提供它。
config/secrets.yml
您可以以 yml 格式在其中存储您想要的任何密钥。确保将文件添加到您的 .gitignore 中,因为您绝对不想将带有密钥的文件存储在某个地方的仓库中。您可以手动将机密文件复制到生产服务器。
development:
omniauth_provider_key: 13232423423242315
omniauth_provider_secret: 2222222222228eff721a0322c
domain_name: lvh.me
secret_key_base: 6ec9ae65d4de59aa1a7ssxxsdifwn9392203905c53a264ffd8255a601d7417b1ed7d4cef67f359e373472f0160aeb9698fa69578a1497b5b99209afd0e
您也可以为 production
staging
或 test
使用相同的结构
现在..一旦你完成了(创建了文件并添加了你的密钥)现在你可以从初始化程序中调用密钥
config.omniauth :google_oauth2, Rails.application.secrets.omniauth_provider_key, Rails.application.secrets.omniauth_provider_secret,
:strategy_class => OmniAuth::Strategies::GoogleOauth2,
:name => 'google',
:scope => 'email,profile,contacts',
:access_type => 'offline',
:image_aspect_ratio => 'square'
我正在尝试配置一个新的 rails4.2 应用程序以针对 Google Oauth2 进行身份验证。
我似乎成功地完成了这个过程,但它被视为失败。
初始授权似乎进行得很顺利,直到 google 发送到回调。然后好像被误判为失败了
给出的错误信息是:
Could not authenticate you from Google because "Invalid credentials".
我已经google寻求解决方案,但无济于事。
是否可以打开额外的日志记录以了解它为什么选择通过失败方法进行处理?
这是请求的日志:
Started GET "/users/auth/google" for 127.0.0.1 at 2016-04-17 09:37:33 +0800
Started GET "/users/auth/google/callback?state=<<state>>&code=<<code>>" for 127.0.0.1 at 2016-04-17 09:37:45 +0800
Processing by Users::OmniauthCallbacksController#failure as HTML
Parameters: {"state"=>"<<state>>", "code"=>"<<code>>"}
Redirected to http://test_app.dev/sign_in
Completed 302 Found in 1ms (ActiveRecord: 0.0ms)
测试的时候,在google提示的时候点了允许,url看起来还不错,为什么会处理成失败了?
config/initializer/devise.rb
config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ['GOOGLE_CLIENT_SECRET'],
:strategy_class => OmniAuth::Strategies::GoogleOauth2,
:name => 'google',
:scope => 'email,profile,contacts',
:access_type => 'offline',
:image_aspect_ratio => 'square'
routes.rb
devise_for :users, :controllers => { omniauth_callbacks: 'users/omniauth_callbacks' }
resources :users
devise_scope :user do
get 'sign_in', :to => 'devise/sessions#new', :as => :new_user_session
get 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session
end
controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def google
logger.debug 'Omniauth callback called' # Never get's called
end
end
application_controller.rb
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
# Direct to user profile after sign in
def after_sign_in_path_for(resource)
user_path(current_user)
end
# Needed by Devise when using omniauth
def new_session_path(scope)
new_user_session_path
end
end
我的宝石:
Using warden 1.2.6
Using devise 3.5.6
Using oauth2 1.0.0
Using omniauth 1.2.2
Using omniauth-oauth2 1.4.0
Using omniauth-google-oauth2 0.4.1
简短的回答是因为你的信誉是错误的。您在配置哈希中的第一个而不是第二个参数上调用 ENV。
更好的答案是..使用更好的捕鼠器。
有时使用 ENV 存储密钥可能会出现问题,您可能没有在启动服务器的同一终端中加载密钥,或者如果您在生产环境中,您可能无法使用查看 ENV 来知道它缺少钥匙。使用机密文件更容易。没关系,rails 正是出于这个原因提供它。
config/secrets.yml
您可以以 yml 格式在其中存储您想要的任何密钥。确保将文件添加到您的 .gitignore 中,因为您绝对不想将带有密钥的文件存储在某个地方的仓库中。您可以手动将机密文件复制到生产服务器。
development:
omniauth_provider_key: 13232423423242315
omniauth_provider_secret: 2222222222228eff721a0322c
domain_name: lvh.me
secret_key_base: 6ec9ae65d4de59aa1a7ssxxsdifwn9392203905c53a264ffd8255a601d7417b1ed7d4cef67f359e373472f0160aeb9698fa69578a1497b5b99209afd0e
您也可以为 production
staging
或 test
现在..一旦你完成了(创建了文件并添加了你的密钥)现在你可以从初始化程序中调用密钥
config.omniauth :google_oauth2, Rails.application.secrets.omniauth_provider_key, Rails.application.secrets.omniauth_provider_secret,
:strategy_class => OmniAuth::Strategies::GoogleOauth2,
:name => 'google',
:scope => 'email,profile,contacts',
:access_type => 'offline',
:image_aspect_ratio => 'square'