区域 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 标头中设置此令牌,以识别调用应用。
// 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#
将在运行时自动替换为应用的默认存储分区名称。