ruby-on-rails - Google Ruby API 客户端 redirect_uri_mismatch 错误

标签 ruby-on-rails ruby google-api-ruby-client

我正在尝试使用 Google 的 API 注册用户并将其登录到我的 Rails Web 应用程序。我一直在玩弄身份验证,但在获得授权码后我遇到了这个错误。

这是我正在尝试做的事情:

path = Rails.root.to_s + PATH_TO_JSON_FILENAME_FROM_GOOGLE_API

client_secrets = Google::APIClient::ClientSecrets.load(path)

auth_client = client_secrets.to_authorization

auth_client.update!(
  :scope => 'https://www.googleapis.com/auth/drive.metadata.readonly',
  :redirect_uri => REDIRECT_URI

)

auth_client.code = ACCESS_CODE_RETURNED_BY_GOOGLE_WHEN_USER_LOGS_IN

auth_client.fetch_access_token!

几个问题:

  1. 我真正想要的是用户名和他们的电子邮件地址。我不清楚 :scope 的正确值应该是多少。
  2. 对于 redirect_uri,我将其设置为我的 Google API 控制台中的重定向 uri 之一。类似于 http://localhost:3000/auth/callback。尽管如此,我还是收到以下 json 响应:

    { “错误”:“redirect_uri_mismatch”

关于我在这里可能做错了什么的想法?

最佳答案

终于明白了。我需要将 redirect_uri 设置为 postmessage,因为这是我最初请求授权代码的方式。这是我的完整解决方案:

我使用以下内容加载 Google 身份验证库:

function start() {
  gapi.load('auth2', function() {
    auth2 = gapi.auth2.init({
      client_id: 'MY_CLIENT_ID',
    });
  });
};

我创建了一个 HTML 按钮,点击它会调用以下函数:

function(e){
    e.preventDefault();    
    auth2.grantOfflineAccess({'redirect_uri': 'postmessage'}).then(this.signInCallback);
},

现在 signInCallback 函数只是记录我的授权代码,这样我就可以测试我正在编写的 ruby​​ 服务器代码:

function(authResult) {
    console.log(authResult.code);
}

这是我的 ruby​​ 文件的样子:

client = Google::APIClient.new
client.authorization.client_id = MY_CLIENT_ID
client.authorization.client_secret = MY_CLIENT_SECRET
client.authorization.redirect_uri = "postmessage"
client.authorization.code = CODE_THAT_WAS_LOGGED_TO_CONSOLE
client.authorization.fetch_access_token!

更多信息:您必须使用“postmessage”调用 grantOfflineAccess。我尝试从我的开发者控制台输入一个实际的重定向 uri,但它不喜欢(更多信息请参见 SO question)。我发现,如果您这样做,那么当您尝试将授权代码交换为访问 token 时,您需要在服务器端执行相同的操作。

关于ruby-on-rails - Google Ruby API 客户端 redirect_uri_mismatch 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31889645/

相关文章:

ruby-on-rails - 将 routes.rb 文件分成多个文件以便更好地管理的好方法是什么?

ruby-on-rails - ActiveRecord::Base.connection.execute 重复 sql 输出

c++ - Ruby C++ 风格的迭代器

google-api - Google Calendar API V3 insert_calendar 返回 503,但日历插入成功

ruby-on-rails - CarrierWave Backgrounder 没有将版本图像上传到 AWS S3

ruby-on-rails - 从嵌套哈希中删除所有相似的键

ruby - 使用 Ruby 为无服务器框架编写授权者

使用数组的具有多个变量的 Ruby case 语句

ruby-on-rails - rails : Send email using Gmail API with attachment return only encoded file not

ruby-on-rails - 在 Rails 应用程序中集成 Google 日历