当我在OAuth屏幕上点击“允许”并在OAuth流程中执行我的回调方法时,我在Signet::AuthorizationError in LoginController#callback
行Authorization failed. Server message: { "error" : "redirect_uri_mismatch" }
和auth_client.fetch_access_token!
了。
我已经查看了这个:Google OAuth 2 authorization - Error: redirect_uri_mismatch,但我仍然无法理解。
我正试图通过谷歌设置登录:
我在Google控制台的网络应用程序凭据中有以下uris:
get '/home' => 'home#index'
get '/login' => 'login#prompt'
get '/login/callback' => 'login#callback'
require 'google/api_client/client_secrets'
class LoginController < ApplicationController
GOOGLE_CLIENT_SECRET_FILE = Rails.root.join('config/google_oauth2_secret.json')
def prompt
if session[:credentials]
redirect_to '/home'
else
auth_client = get_auth_client
auth_client.update!(
:scope => ['profile', 'email'],
:redirect_uri => 'http://localhost:3000/login/callback'
)
@auth_uri = auth_client.authorization_uri.to_s
render layout: false
end
end
def callback
auth_client = get_auth_client
auth_client.code = request['code']
auth_client.fetch_access_token!
auth_client.client_secret = nil
session[:credentials] = auth_client.to_json
redirect_to '/home'
end
private
def get_auth_client
Google::APIClient::ClientSecrets.load(GOOGLE_CLIENT_SECRET_FILE).to_authorization
end
end
我也很担心。在我的prompt
方法中,如何验证session[:credentials]
是否是正确的会话代码?难道没有人只是将一些虚假的字符串放入credentials
会话并获得访问权限吗?
我一直关注此指南:https://developers.google.com/api-client-library/ruby/auth/web-app
答案 0 :(得分:1)
这是因为localhost不是有效的域名。您需要使用 lvh.me
,而不是使用localhost在Google控制台中,网址将变为
http://lvh.me:3000
http://lvh.me:3000/login/callback
尝试使用http://lvh.me:3000代替http://localhost:3000
在浏览器中访问您的应用lvh.me是一个有效的域名,指向127.0.0.1
答案 1 :(得分:0)
我意识到问题是我在生成auth uri时在prompt
函数中设置范围,但在我的callback
函数中,我没有设置范围。
应该是这样的:
def callback
auth_client = get_auth_client
auth_client.update!(
:scope => ['profile', 'email'],
:redirect_uri => 'http://localhost:3000/login/callback'
)
auth_client.code = request['code']
auth_client.fetch_access_token!
auth_client.client_secret = nil
session[:credentials] = auth_client.to_json
redirect_to '/home'
end