使用Google Oauth2.0登录:授权失败。服务器消息:{“error”:“redirect_uri_mismatch”}

时间:2016-02-25 04:28:52

标签: ruby-on-rails ruby oauth oauth-2.0 google-oauth

当我在OAuth屏幕上点击“允许”并在OAuth流程中执行我的回调方法时,我在Signet::AuthorizationError in LoginController#callbackAuthorization failed. Server message: { "error" : "redirect_uri_mismatch" }auth_client.fetch_access_token!了。

我已经查看了这个:Google OAuth 2 authorization - Error: redirect_uri_mismatch,但我仍然无法理解。

我正试图通过谷歌设置登录:

  1. 用户转到/登录并点击“使用google登录”按钮。
  2. 出现Google登录提示,用户使用Gmail登录,然后重定向到/ home。
  3. 我在Google控制台的网络应用程序凭据中有以下uris:

    1. http://localhost:3000
    2. http://localhost:3000/login/callback
    3. http://localhost/login/callback
    4. http://localhost
    5. 的routes.rb

      get '/home' => 'home#index'
      get '/login' => 'login#prompt'
      get '/login/callback' => 'login#callback'
      

      login_controller.rb

      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

2 个答案:

答案 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