Google Ruby API 客户端 redirect_uri_mismatch 错误
Google Ruby API Client redirect_uri_mismatch error
我正在尝试使用 Google 的 API 来注册和登录用户到我的 rails webapp。我一直在尝试身份验证,但在获得授权码后,我遇到了这个错误。
这是我正在尝试做的事情:
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!
几个问题:
- 我真正想要的只是用户名和他们的电子邮件地址。我不清楚
:scope
的正确值应该是多少。
对于 redirect_uri
,我将其设置为我的 Google API 控制台中的重定向 URI 之一。类似于 http://localhost:3000/auth/callback
的内容。尽管如此,我还是收到以下 json 回复:
{
"error" : "redirect_uri_mismatch"
}
关于我在这里可能做错了什么的想法?
重定向URI不匹配错误肯定意味着重定向URI与注册的不一样。额外确保 URI 相同。
终于明白了。我需要将 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)。我发现如果您这样做,那么当您尝试将授权代码交换为访问令牌时,您需要在服务器端做同样的事情。
我正在尝试使用 Google 的 API 来注册和登录用户到我的 rails webapp。我一直在尝试身份验证,但在获得授权码后,我遇到了这个错误。
这是我正在尝试做的事情:
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!
几个问题:
- 我真正想要的只是用户名和他们的电子邮件地址。我不清楚
:scope
的正确值应该是多少。 对于
redirect_uri
,我将其设置为我的 Google API 控制台中的重定向 URI 之一。类似于http://localhost:3000/auth/callback
的内容。尽管如此,我还是收到以下 json 回复:{ "error" : "redirect_uri_mismatch" }
关于我在这里可能做错了什么的想法?
重定向URI不匹配错误肯定意味着重定向URI与注册的不一样。额外确保 URI 相同。
终于明白了。我需要将 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)。我发现如果您这样做,那么当您尝试将授权代码交换为访问令牌时,您需要在服务器端做同样的事情。