I need a little help using the Google Compute Engine API from the Engine application code. The following is part of the code that I use to get a list of computer instances (simplified version).
try { final AppIdentityService appIdService = AppIdentityServiceFactory .getAppIdentityService(); AppIdentityService.GetAccessTokenResult result = appIdService .getAccessTokenUncached(Collections .singletonList(ComputeScopes.COMPUTE)); String accessToken = result.getAccessToken(); String url = "https://www.googleapis.com/compute/v1/projects/MYPROJECTID/zones/us-central1-b/instances"; String payload = ""; // Create HTTPRequest and set headers HTTPRequest httpRequest = new HTTPRequest(new URL(url.toString()), HTTPMethod.GET, FetchOptions.Builder.doNotFollowRedirects()); httpRequest.addHeader(new HTTPHeader("Authorization", "OAuth " + accessToken)); httpRequest.addHeader(new HTTPHeader("Host", "www.googleapis.com")); httpRequest.addHeader(new HTTPHeader("Content-Length", Integer .toString(payload.length()))); httpRequest.addHeader(new HTTPHeader("Content-Type", "application/json")); httpRequest.addHeader(new HTTPHeader("User-Agent", "google-api-java-client/1.0")); httpRequest.setPayload(payload.getBytes()); URLFetchService fetcher = URLFetchServiceFactory .getURLFetchService(); HTTPResponse httpResponse = fetcher.fetch(httpRequest); int responseCode = httpResponse.getResponseCode(); if ((responseCode == 200) || (responseCode == 204)) { String contentStr = new String(httpResponse.getContent()); return extractIpsAndInstanceNames(contentStr, prefix); } else { logger.warning("Failed. Response code " + responseCode + " Reason: " + new String(httpResponse.getContent())); }
As you can see, I use AppIdentity to get the access token. Then use it in the request header in the API call.
Basically every time a call fails
Failed. Response code 404 Reason: { "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "The resource 'projects/MYPROJECTID' was not found" } ], "code": 404, "message": "The resource 'projects/MYPROJECTID' was not found" } }
Interestingly, if I use the following webapp https://developers.google.com/compute/docs/reference/latest/instances/list#try-it to make the same API call, it succeeds.
So, I looked at what data is sent when this web application makes a request and copies the string of the carrier token and uses it in the "Authorization" header. Oddly enough, the request has already completed successfully without changing anything. Basically this application uses a custom Oauth2 token type - so for me it looks like a problem with a token received through AppIdentity. Can someone point me in the right direction? Thanks!
source share