# App Identity API for App Engine
The App Identity API lets an application discover its application ID (also
called the [project ID](https://support.google.com/cloud/answer/6158840)). Using
the ID, an App Engine application can assert its identity to other App Engine
Apps, Google APIs, and third-party applications and services. The application ID
can also be used to generate a URL or email address, or to make a run-time
decision.
## Getting the project ID
The project ID can be found using the
`ApiProxy.getCurrentEnvironment().getAppId()` method.
## Getting the application hostname
By default, App Engine apps are served from URLs in the form
https://PROJECT_ID.REGION_ID.r.appspot.com, where the project ID is part of the
hostname. If an app is served from a custom domain, it may be necessary to
retrieve the entire hostname component. You can do this using the
`com.google.appengine.runtime.default_version_hostname` attribute of the
`CurrentEnvironment`.
[View `IdentityServlet.java` on GitHub (region:
gae_java8_app_identity_versioned_hostnames)](https://github.com/GoogleCloudPlatform/java-docs-samples/blob/e1a3689fdc4f0b8e8e338f172262e1818808edf2/appengine-java8/appidentity/src/main/java/com/example/appengine/appidentity/IdentityServlet.java)
## Asserting identity to other App Engine apps
If you want to determine the identity of the App Engine app that is making a
request to your App Engine app, you can use the request header
`X-Appengine-Inbound-Appid`. This header is added to the request by the URLFetch
service and is not user modifiable, so it safely indicates the requesting
application's project ID, if present.
**Requirements**:
In your application handler, you can check the incoming ID by reading the
`X-Appengine-Inbound-Appid` header and comparing it to a list of IDs allowed to
make requests.
## Asserting identity to Google APIs
Google APIs use the OAuth 2.0 protocol for [authentication and
authorization](https://developers.google.com/identity/protocols/OAuth2). The App
Identity API can create OAuth tokens that can be used to assert that the source
of a request is the application itself. The `getAccessToken()` method returns an
access token for a scope, or list of scopes. This token can then be set in the
HTTP headers of a call to identify the calling application.
The following example shows how to use the App Identity API to make a REST call
to the Google URL Shortener API.
Note: the [Google API Client
Libraries](https://developers.google.com/discovery/libraries) can also manage
much of this for you automatically.
[View `UrlShortener.java` on GitHub (region:
gae_java8_app_identity_google_apis)](https://github.com/GoogleCloudPlatform/java-docs-samples/blob/java25_samples/appengine-java8/appidentity/src/main/java/com/example/appengine/appidentity/UrlShortener.java)
Note that the application's identity is represented by the service account name,
which is typically *applicationid@*. You can get the exact value by using the
`getServiceAccountName()` method. For services which offer ACLs, you can grant
the application access by granting this account access.
## Asserting identity to third-party services
The token generated by `getAccessToken()` only works against Google services.
However you can use the underlying signing technology to assert the identity of
your application to other services. The `signForApp()` method will sign bytes
using a private key unique to your application, and the
`getPublicCertificatesForApp()` method will return certificates which can be
used to validate the signature.
Note: The certificates may be rotated from time to time, and the method may
return multiple certificates. Only certificates that are currently valid are
returned; if you store signed messages you will need additional key management
in order to verify signatures later.
Here is an example showing how to sign a blob and validate its signature:
[View `SignForAppServlet.java` on GitHub (region:
gae_java8_app_identity_other_services)](https://github.com/GoogleCloudPlatform/java-docs-samples/blob/java25_samples/appengine-java8/appidentity/src/main/java/com/example/appengine/appidentity/SignForAppServlet.java)
## Getting the default Cloud Storage Bucket name
Each application can have one default Cloud Storage bucket, which includes [5GB
of free storage and a free quota for I/O
operations](/appengine/docs/quotas#Default_Gcs_Bucket).
To get the name of the default bucket,
you can use the App Identity API. Call
[AppIdentityService.getDefaultGcsBucketName](/appengine/docs/legacy/standard/java/javadoc/com/google/appengine/api/appidentity/AppIdentityService.html#getDefaultGcsBucketName--).