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

Authorization Error, Error 400: redirect_uri_mismatch Gmail API

我正在关注此 Ruby Gmail API quickstart guide 以授权用户使用 Gmail API。我在 Google 控制台创建了一个 Web Application 类型的应用程序并生成了它的 credentials.json 文件(并将其放在 quickstart.rb 旁边)。我已经为在 heroku 上作为 rails 应用程序托管的应用程序提供了 redirect_uri。 url格式如下

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

当我 运行 quickstart.rb 时,它会在控制台

中显示以下消息

Open the following URL in the browser and enter the resulting code after authorization: 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

我在浏览器中打开 link 后显示此错误

The redirect URI in the request, urn:ietf:wg:oauth:2.0:oob, can only be used by a Client ID for native application. It is not allowed for the WEB client type. You can create a Client ID for native application at https://console.developers.google.com/apis/credentials/oauthclient

我已经在相应应用程序的 google 控制台上注册了所提供的 redirect_uri。我无法找到导致此问题的原因 issue.I 最终想从我的 rails 应用程序服务器调用此 Gmail API,但我无法继续。

有几种类型的身份验证让我们看看其中的两种。第一个是 web,它被设计为在 Web 服务器上工作,其中授权 returned 到 webservier 本身来处理它。第二个是已安装的应用程序,它将 return 对本地主机或发送请求的端点的响应。

您正在关注的代码 Ruby quick start 在顶部声明它旨在作为控制台应用程序或已安装的应用程序工作,这就是您看到 urn:ietf:wg:oauth:2.0:oob 的原因,这意味着本地主机

Complete the steps described in the rest of this page to create a simple Ruby command-line application that makes requests to the Gmail API.

用于对两种不同类型的客户端进行身份验证的代码是不同的。您的示例中的代码旨在与已安装的应用程序一起使用,要使其正常工作,您需要在 google 开发人员控制台上创建已安装的本机凭据,您创建的 Web 凭据将不适用于您正在使用的代码。

对于 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
  }
)