适用于旧版捆绑服务的 App Identity API

区域 ID

REGION_ID 是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r 包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。

详细了解区域 ID

借助 App Identity API,应用能够找到其应用 ID(也称为项目 ID)。App Engine 应用可使用该 ID 向其他 App Engine 应用、Google API 以及第三方应用和服务声明其身份。应用 ID 也可用于生成网址或电子邮件地址,或者用于在运行时做出决策。

获取项目 ID

您可以使用 AppIdentityService::getApplicationId() 方法查找项目 ID。

获取应用主机名

默认情况下,App Engine 应用通过 https://PROJECT_ID.REGION_ID.r.appspot.com 形式的网址提供,其中项目 ID 是主机名的一部分。如果应用是通过自定义网域提供的,则可能需要检索整个主机名的组成部分。您可以使用 AppIdentityService::getDefaultVersionHostname() 方法完成该操作。

向其他 App Engine 应用声明身份

如果要确定向您的 App Engine 应用发出请求的 App Engine 应用的身份,则可以使用请求标头 X-Appengine-Inbound-Appid。此标头由 URLFetch 服务添加到请求中,而且用户无法修改,因此它安全地标明了发出请求的应用的项目 ID(如果存在)。

要求

  • 只有对应用的 appspot.com 网域进行的调用才包含 X-Appengine-Inbound-Appid 标头。对自定义网域的调用不包含该标头。
  • 您的请求必须设置为不遵循重定向。

在应用处理程序中,您可以通过读取 X-Appengine-Inbound-Appid 标头并将其与允许发出请求的 ID 列表进行比对来检查传入 ID。

向 Google API 声明身份

Google API 使用 OAuth 2.0 协议进行身份验证和授权。App Identity API 可以创建 OAuth 令牌,这些令牌可用于声明请求的来源是应用本身。getAccessToken() 方法会返回一个范围或范围列表的访问令牌。然后,可以在调用的 HTTP 标头中设置此令牌,以识别调用应用。

以下示例展示了如何通过 App Identity API,使用 OAuth 来检索 Google 日历联系人。
// Retrieves Google Calendar contacts using OAuth

use google\appengine\api\app_identity\AppIdentityService;

function setAuthHeader() {
  $access_token = AppIdentityService::getAccessToken('https://www.google.com/m8/feeds');
  return [sprintf('Authorization: OAuth %s', $access_token['access_token'])];
}

$get_contacts_url = 'https://www.google.com/m8/feeds/contacts/default/full';
$headers = setAuthHeader();
$opts = [
  'http' => [
    'header' => implode("\r\n", $headers),
  ],
];

$context = stream_context_create($opts);

$response = file_get_contents($get_contacts_url, false, $context);

$xml = simplexml_load_string($response);

$email = $xml->author->email;
$service_account = AppIdentityService::getServiceAccountName();

if (strcmp($email, $service_account) != 0) {
  die(sprintf('%s does not match the service account name %s.',
              $email,
              $service_account));
}

请注意,应用的身份由服务账号名称表示,通常为 applicationid@appspot.gserviceaccount.com。您可以使用 getServiceAccountName() 方法获取确切的值。对于提供 ACL 的服务,您可以通过向此账号授予访问权限来向应用授予访问权限。

向第三方服务声明身份

getAccessToken() 生成的令牌仅适用于 Google 服务。但是,您可以使用基础签名技术向其他服务声明应用的身份。signForApp() 方法将使用应用特有的私钥为字节签名,并且 getPublicCertificates() 方法将返回可用于验证签名的证书。

获取默认的 Cloud Storage 存储分区名称

每个应用都可以有一个默认的 Cloud Storage 存储分区,其中包括 5 GB 免费存储空间和免费的 I/O 操作配额

要获取默认存储分区的名称,请调用 CloudStorageTools::getDefaultGoogleStorageBucketName。或者,还可以使用值 #default# 作为存储分区名称,其中 #default# 将在运行时自动替换为应用的默认存储分区名称。