授权 PHP 网络应用 + GDAL 应用通过 OAuth2 使用 Google 服务

Authorizing a PHP web app + GDAL app to use Google services via OAuth2

我正在编写一个 PHP 应用程序来访问存储在 Google 地图引擎中的数据。我在 API 控制台中为 Web 应用程序 创建了一个 客户端 ID。因此,我可以授权我的应用使用 Google API PHP client 访问我的 GME 数据。目前没问题。

我的网络应用程序,在某个特定时刻,调用一个系统二进制文件 (ogr2ogr),它也需要访问存储在 Google 地图引擎中的数据。所以,我假装使用 GME driver 并作为配置参数传递:

  • 客户端 ID、客户端密码和 api 密钥(来自我在 API 控制台中创建的客户端 ID)
  • 授权令牌和刷新令牌(来自授权响应)

但是问题来了:

当我尝试使用之前的授权参数调用 ogr2ogr 时,它 returns HTTP 400 错误:多次尝试使用 OAuth2 授权代码。看来我传递的刷新令牌无效

深入问题,发现不明白的地方:Google API console allows you to create Web 应用程序的客户端 ID,但 在客户端应用程序和服务器端应用程序之间没有区别。 Google OAuth2 文档使这种情况有所不同:

因此,理论上,我创建的客户端 ID 用于客户端应用程序,我将其与服务器端应用程序一起使用 (PHP)

所以,我的问题:

  • 如何在 API 控制台中创建一个客户端 ID,我可以将其用于:PHP 应用程序和 ogr2ogr 二进制文件(我已经测试过ogr2ogr 二进制文件带有 已安装应用程序的客户端 ID ,它运行良好,但该客户端 ID 不能用于 PHP 应用程序)。
  • 为什么 API 控制台不像文档那样区分客户端 Web 应用程序和服务器端 Web 应用程序的客户端 ID?显然,我误会了什么。例如,this tutorial 客户端 ID 用于网络应用程序 用于 PHP 代码(但仅用于网络应用程序,而不用于调用其他也需要授权的程序)

非常感谢

你是对的,你正试图通过客户端身份验证流程使用服务器端身份验证密钥,这是行不通的。您需要做的是将您的访问令牌传递给 GDAL GME 驱动程序。

您可以通过以下方式之一完成:

  1. 只需将 access=<your access token> 参数添加到与 ogr2ogr(以 "GME:" 开头的字符串)一起使用的 "file name"。
  2. 您也可以使用 GME_ACCESS_TOKEN 环境变量。

这将简化 OAuth2 流程,并且程序实际上不会进入 AOuth2 身份验证流程,而只是重新使用您的 PHP 脚本生成的身份验证令牌。这是有效的,因为您是从同一台机器发出请求并且在令牌过期之前。

这(现在)也记录在 http://trac.osgeo.org/gdal/wiki/GMEDriver