Hide
Go

App Identity Go Functions

Python |Java |PHP |Go
Code sometimes needs to determine the identifier of the application in which it is executing. This may be to generate a URL or email address, or possibly to make some run-time decision. App Engine includes an Application Identity service for this purpose.

  1. Identifying itself
  2. Asserting identity to other App Engine apps
  3. Asserting identity to Google APIs
  4. Asserting identity to other systems

Identifying itself

Application ID

The application ID can be found using the appengine.AppID function.

Versioned hostnames

A related operation is the need to get the hostname part of a URL to the application. You can use the appengine.DefaultVersionHostname function for this purpose. This is useful in certain scenarios when the application is not available at http://your_app_id.appspot.com.

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 ID, if present.

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

Many Google APIs support OAuth assertions to identify the source of the request. The App Identity API provides a service that creates tokens that can be used to assert that the source of a request is the application itself. The appengine.AccessToken function 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 illustrates a REST call to the Google URL Shortener API. Note that the Google API Client Libraries can also manage much of this for you automatically.

import (
	"net/http"

	"appengine"
	"appengine/urlfetch"

	"golang.org/x/oauth2"
	"golang.org/x/oauth2/google"
	urlshortener "google.golang.org/api/urlshortener/v1"
)

// shortenURL returns a short URL which redirects to the provided url,
// using Google's urlshortener API.
func shortenURL(c appengine.Context, url string) (string, error) {
	transport := &oauth2.Transport{
		Source: google.AppEngineTokenSource(c, urlshortener.UrlshortenerScope),
		Base:   &urlfetch.Transport{Context: c},
	}
	client := &http.Client{Transport: transport}

	svc, err := urlshortener.New(client)
	if err != nil {
		return "", err
	}

	resp, err := svc.Url.Insert(&urlshortener.Url{LongUrl: url}).Do()
	if err != nil {
		return "", err
	}
	return resp.Id, nil
}

Note that the application's identity is represented by the service account name, which is typically applicationid@appspot.gserviceaccount.com. You can get the exact value by using the appengine.ServiceAccount function. For services which offer ACLs, you can grant the application access by granting this account access.

Asserting identity to other systems

The token generated by AccessToken only works against Google systems. However you can use the underlying signing technology to assert the identity of your application to other systems. The appengine.SignBytes function will sign bytes using a private key unique to your application, and the appengine.PublicCertificates function will return certificates which can be used to validate the signature.