谷歌Ruby API客户端redirect_uri_mismatch错误



我试图使用谷歌的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响应:

    {"error": "redirect_uri_mismatch"}

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

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

我用下面的代码加载Google Authentication库:

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,它不喜欢那样(见这个问题)。我发现,如果您这样做,那么当您尝试将授权代码交换为访问令牌时,您需要在服务器端做同样的事情。

重定向URI不匹配错误肯定意味着重定向URI与注册的不相同。要特别确保uri是相同的。

最新更新