授权错误,错误400:Gmail API redirect_uri_mismatch

问题描述

我正在遵循这个Ruby Gmail API quickstart guide来授权用户使用Gmail API。我已经在Google控制台上创建了一个Web Application类型的应用,并生成了它的certificate.json文件(并将其放置在quickstart.rb旁边)。我为应用程序提供了redirect_uri,该应用程序在heroku上作为Rails应用程序托管。网址格式如下

https://myapp-api-heroku.com/my_redirect_endpoint

当我运行quickstart.rb时,它将在控制台中显示以下消息

在浏览器中打开以下URL,然后输入结果代码 授权后: https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&client_id=my_client_id_here&include_granted_scopes=true&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=https://www.googleapis.com/auth/gmail.readonly

在浏览器中打开链接后,它会显示错误

请求中的重定向URI urn:ietf:wg:oauth:2.0:oob只能由本机应用程序的客户端ID使用。不允许使用WEB客户端类型。您可以在https://console.developers.google.com/apis/credentials/oauthclient

上为本机应用程序创建一个客户端ID。

我已经在相应应用程序的Google控制台中注册了提供的redirect_uri。我找不到导致此问题的原因。最终我想从我的Rails应用服务器中调用此Gmail API,但无法继续进行操作。

解决方法

有几种类型的身份验证让我们看看其中两种。第一个是Web,它将被设计为可在Web服务器上工作,然后将授权返回给Webservier本身以进行处理。第二个是已安装的应用程序,它将响应返回给本地主机或发送请求的端点。

您正在遵循的Ruby quick start代码在顶部表示它被设计为用作控制台应用程序或已安装的应用程序,这就是为什么您看到urn:ietf:wg:oauth:2.0:oob的原因,这意味着本地主机

完成本页面其余部分中描述的步骤,以创建一个简单的Ruby命令行应用程序,该应用程序向Gmail API发出请求。

用于向两种不同类型的客户端进行身份验证的代码不同。您的示例中的代码旨在与已安装的应用程序配合使用,要使其正常运行,您需要在已创建Web凭据的Google Developer Console上创建已安装的本机凭据,该凭据无法与您所使用的代码一起使用。

对于Web服务器应用程序,您应该遵循webauth

require 'google/apis/drive_v2'
require 'google/api_client/client_secrets'

client_secrets = Google::APIClient::ClientSecrets.load
auth_client = client_secrets.to_authorization
auth_client.update!(
  :scope => 'https://www.googleapis.com/auth/drive.metadata.readonly',:redirect_uri => 'http://www.example.com/oauth2callback',:additional_parameters => {
    "access_type" => "offline",# offline access
    "include_granted_scopes" => "true"  # incremental auth
  }
)