PHP バージョン 5.5 はコミュニティでサポートを終了したため、新しいアプリでは PHP 7 ランタイムを使用することを強くおすすめします。

PHP 5 用の App Identity API の概要

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国および州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。既存のアプリでは省略可能ですが、間もなく、新しいアプリのすべてにおいて App Engine の URL に REGION_ID.r を含めることが必須となる予定です。

移行がスムーズに行われるように、リージョン ID を使用するよう App Engine を徐々に更新しています。Google Cloud プロジェクトがまだ更新されていない場合、アプリにリージョン ID が表示されません。ID は既存のアプリでは省略可能なため、リージョン ID が既存のアプリで使用可能になったときに、URL を更新する、またはその他の変更を行う必要はありません。

詳しくは、リージョン ID をご覧ください。

App Identity API は、アプリケーションがアプリケーション ID(「プロジェクト ID」)を見つけられるようにします。App Engine アプリケーションは ID を使用して、そのアプリケーションの識別情報を他の App Engine アプリ、Google API、サードパーティ アプリケーションおよびサービスに表明します。アプリケーション ID は URL やメールアドレスの生成、ランタイムでの決定にも使用できます。

プロジェクト ID を取得する

プロジェクト ID は AppIdentityService::getApplicationId() メソッドで確認できます。

アプリケーションのホスト名を取得する

デフォルトでは、App Engine アプリは https://PROJECT_ID.REGION_ID.r.appspot.com という形式の URL から提供され、プロジェクト ID はホスト名の一部になります。アプリがカスタム ドメインから提供される場合、ホスト名のコンポーネント全体の取得が必要となることがあります。その場合は、AppIdentityService::getDefaultVersionHostname() メソッドを使用します。

他の App Engine アプリに ID を表明する

App Engine アプリにリクエストを行っている App Engine アプリの ID を特定するには、リクエスト ヘッダー X-Appengine-Inbound-Appid を使用します。このヘッダーは URLFetch サービスによりリクエストに追加され、ユーザーによる変更はできないため、リクエスト元のアプリケーション ID がある場合、その ID が安全に表示されます。

要件:

  • アプリの appspot.com ドメインへの呼び出しのみに X-Appengine-Inbound-Appid ヘッダーが含まれます。カスタム ドメインへの呼び出しにはヘッダーが含まれません。
  • リダイレクトに従わないようにリクエストを設定する必要があります。

アプリケーション ハンドラでは、X-Appengine-Inbound-Appid ヘッダーを読み取り、リクエストを行うことを許可された ID のリストと比較することで受信 ID を確認できます。

Google API に ID を表明する

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));
}

アプリケーションの ID はサービス アカウント名で表されます。通常は applicationid@appspot.gserviceaccount.com となります。正確な値を取得するには、getServiceAccountName() メソッドを使用します。ACL を提供するサービスでは、このアカウントのアクセスを許可することでアプリケーションにアクセスを許可します。

サードパーティのサービスに ID を表明する

getAccessToken() によって生成されたトークンは、Google サービスでのみ有効です。ただし、基盤となる署名テクノロジーを使用してアプリケーションの ID をその他のサービスに表明できます。signForApp() メソッドがアプリケーション固有の秘密鍵を使用してバイトに署名し、getPublicCertificates() メソッドが署名の検証に使用できる証明書を返します。

デフォルトの Cloud Storage バケット名を取得する

各アプリケーションには 1 つのデフォルトの Cloud Storage バケットがあります。このバケットには無料のストレージ容量 5 GB と I/O オペレーションの無料の割り当てが含まれます。

デフォルトのバケット名を取得するには、CloudStorageTools::getDefaultGoogleStorageBucketName を呼び出します。また、必要に応じてバケット名として #default# の値を使用します。#default# はランタイムに、アプリケーションのデフォルトのバケット名に自動的に置換されます。