Note that there are some explanatory texts on larger screens.

plurals
  1. POListing Circles with Google+ for Domains API fails in access_denied
    primarykey
    data
    text
    <p>This is killing me! I'm trying to list the Google Plus circles of a user in my domain, using Domain wide delegation. This should be exactly what the google developer api example does.</p> <p>I've set up an application in Google's Cloud console, enabled the Google+ for Domains API there and created a server certificate.</p> <p>Then, I added the scope in the Google Apps admin console.</p> <p>My code:</p> <pre><code>package com.MYDOMAIN.plus; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.Arrays; import java.util.List; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson.JacksonFactory; import com.google.api.services.plusDomains.PlusDomains; import com.google.api.services.plusDomains.model.Circle; import com.google.api.services.plusDomains.model.CircleFeed; public class PlusHelper { // Fill in the following values based upon the previous steps private static final String SERVICE_ACCOUNT_EMAIL = "39578475189-vefb22ohjt9dahloahfsp9h9bol7r6ie@developer.gserviceaccount.com"; private static final String SERVICE_ACCOUNT_PKCS12_FILE_PATH = "/Users/kees/Documents/workspace/MYDOMAINPlus/2a282bbacf8895b821e7cf662a98de4d65e38b2a-privatekey.p12"; private static final String USER_EMAIL = "kees@MYDOMAIN.com"; // List the scopes your app requires. These must match the scopes // registered in the Admin console for your Google Apps domain. private static final List&lt;String&gt; SCOPE = Arrays.asList( "https://www.googleapis.com/auth/plus.circles.read"); private static PlusDomains authenticate(final String userEmail) throws GeneralSecurityException, IOException { System.out.println(String.format("Authenticate the domain for %s", userEmail)); HttpTransport httpTransport = new NetHttpTransport(); JsonFactory jsonFactory = new JacksonFactory(); // Setting the sub field with USER_EMAIL allows you to make API calls using the special keyword // "me" in place of a user id for that user. GoogleCredential credential = new GoogleCredential.Builder() .setTransport(httpTransport) .setJsonFactory(jsonFactory) .setServiceAccountId(SERVICE_ACCOUNT_EMAIL) .setServiceAccountScopes(SCOPE) .setServiceAccountUser(USER_EMAIL) .setServiceAccountPrivateKeyFromP12File( new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH)) .build(); // Create and return the authorized API client PlusDomains service = new PlusDomains.Builder(httpTransport, jsonFactory, credential).setApplicationName("PlusSync").build(); return service; } public static void main(String[] args) { /** Global Drive API client. */ PlusDomains plusDomains; try { plusDomains = PlusHelper.authenticate(USER_EMAIL); PlusDomains.Circles.List listCircles = plusDomains.circles().list(USER_EMAIL); listCircles.setMaxResults(5L); CircleFeed circleFeed = listCircles.execute(); List&lt;Circle&gt; circles = circleFeed.getItems(); // Loop until no additional pages of results are available. while (circles != null) { for (Circle circle : circles) { System.out.println(circle.getDisplayName()); } // When the next page token is null, there are no additional pages of // results. If this is the case, break. if (circleFeed.getNextPageToken() != null) { // Prepare the next page of results listCircles.setPageToken(circleFeed.getNextPageToken()); // Execute and process the next page request circleFeed = listCircles.execute(); circles = circleFeed.getItems(); } else { circles = null; } } } catch (GeneralSecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } </code></pre> <p>This results in this error:</p> <pre><code>com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request { "error" : "access_denied" } at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105) at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:332) at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:352) at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:269) at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:454) at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:215) at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:854) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460) at com.MYDOMAIN.plus.PlusHelper.main(PlusHelper.java:60) </code></pre> <p>Does anyone have ANY idea? It's killing me, because I had this working on another domain before!</p> <p>BTW the "MYDOMAIN" throughout my code and stacktrace is a replacement of the actual domain obviously.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload