google oauth2 representa a conta de serviço com [email protected]
Eu queria acessar alguns serviços da API do Google:
API do GDriveAPI de contatoAPI de pessoasE estou lutando com o fluxo de conta de serviço oauth2 (você conhece esse:Google Oauth v2 - descrição da conta de serviço. Para personificação, você deve aplicar a "Delegação de autoridade em todo o domínio" no console do Google Apps, baixar o arquivo pk12 com nova codificação e ativar a API em um projeto do Google Console.
No momento eu sempre recebo:
com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at oauthsample.GDriveAPI.<init>(GDriveAPI.java:50)
at oauthsample.GDriveAPI.main(GDriveAPI.java:85)
Aqui está o meu código:
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
Set<String> scopes = new HashSet<String>();
scopes.add("https://www.google.com/m8/feeds");
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("[email protected]")
.setServiceAccountPrivateKeyFromP12File(new File("somep12key.p12"))
.setServiceAccountScopes(scopes)
.setServiceAccountUser("[email protected]")
.build();
credential.refreshToken();
ContactsService service = new ContactsService("MYAPP");
service.getRequestFactory().setHeader("User-Agent", "MYAPP");
service.setHeader("GData-Version", "3.0");
service.setOAuth2Credentials(credential);
URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full");
ContactFeed resultFeed = service.getFeed(feedUrl, ContactFeed.class);
Também pesquisei bastante pelo stackoverflow (não consigo listar todas as referências e verifiquei as respostas e soluções). Mas uma pergunta nunca foi respondida claramente - nem no documento do Google nem em todas as postagens de stackoverflow:
É realmente possível representar uma conta de serviço com um usuário normal [email protected] (refiro-me a uma conta normal do Gmail sem acesso ao console administrativo mencionado no capítulo "Delegando autoridade de todo o domínio à conta de serviço" e sem ter um próprio domínio)?Alguns dizem que sim, outros dizem que não. Então, qual é a verdade absoluta?
Pelo que entendi ao ler os documentos do google: A conta de serviço só pode se passar por usuários quando você é responsável por um domínio próprio e você precisa ter uma conta do google work com seu próprio domínio registrado. Então, você poderá acessar o console do administrador e conceder acesso à conta de serviço.
Agradecemos sua paciência e seu tempo para responder.
Atenciosamente Matt