2012-07-22 34 views
6

error que estoy consiguiendo:Obtener UserInfo de OAuth2 Google API de contactos

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized 
{ 
    "code" : 401, 
    "errors" : [ { 
    "domain" : "global", 
    "location" : "Authorization", 
    "locationType" : "header", 
    "message" : "Invalid Credentials", 
    "reason" : "authError" 
    } ], 
    "message" : "Invalid Credentials" 
} 

A continuación código, estoy usando:

GoogleCredential credential = new GoogleCredential.Builder() 
    .setTransport(this.TRANSPORT).setJsonFactory(this.JSON_FACTORY) 
    .setClientSecrets(Constants.CLIENT_ID, Constants.CLIENT_SECRET).build(); 
credential.setAccessToken(tokenResponse.getAccessToken()); 
credential.setAccessToken(tokenResponse.getRefreshToken()); 

Hasta aquí, consigo token de actualización, acceso de emergencia, etc.

Oauth2 userInfoService = new Oauth2.Builder(this.TRANSPORT, 
     this.JSON_FACTORY, credential.getRequestInitializer()) 
     .setApplicationName(Constants.APPLICATION_NAME).build(); 

Se produce un error en la línea de abajo: (no sé, ¿por qué?)

Userinfo userInfo = userInfoService.userinfo().get().execute(); 

He buscado en la web y obtengo muy pocos ejemplos de él y materiales raros. ¿Algún cuerpo tiene alguna idea al respecto?

¿Qué estoy haciendo mal?

Respuesta

5

Supongo que credential.getRequestInitializer() es nulo.

He resuelto mediante fijación de una petición de encargo de inicialización para el objeto de credenciales como documentation especifies este

GoogleCredential credential = new GoogleCredential.Builder() 
.setTransport(this.TRANSPORT).setJsonFactory(this.JSON_FACTORY) 
.setClientSecrets(Constants.CLIENT_ID, Constants.CLIENT_SECRET).setRequestInitializer((new HttpRequestInitializer(){ 
       @Override 
       public void initialize(HttpRequest request) 
         throws IOException { 
        request.getHeaders().put("Authorization", "Bearer " + accessToken); 
       } 
      })).build() 

de Google lo siguiente:

** Por ejemplo, una llamada a la API de información del usuario utilizando el parámetro de cadena de consulta access_token tiene el siguiente aspecto:

OBTENGA https://www.googleapis.com/oauth2/v1/userinfo?access_token= {accessToken} Llamada a la misma API utilizando el acceso a ken en la cabecera HTTP tiene el siguiente aspecto:

GET/OAuth2/v1/userinfo HTTP/1.1 Autorización: Portador {} accessToken Host: googleapis.com **

Hope esto le ayudará a

+0

¡Perfecto! Gracias Javiercbk. –

0

Con el fin de recuperar los datos de la API UserInfo usted tiene que solicitar el acceso a su ámbito de OAuth:

https://www.googleapis.com/auth/userinfo.profile

también añaden el alcance https://www.googleapis.com/auth/userinfo.email si quiere recuperar la dirección de correo electrónico.

En su código no veo dónde establece los ámbitos OAuth a los que solicita acceso.

+0

He añadido que alcance también ... y su funcionamiento muy bien ... Después de concesiones de acceso i no consiguen respuesta requerida. Entonces, en resumen, incluí el alcance del correo electrónico también. –

1

Si ya obtuvo el token de acceso (GoogleTokenResponse), entonces también puede hacer esto:

HttpTransport transport = new NetHttpTransport(); 

List<String> applicationScopes = Arrays.asList(
    PlusScopes.USERINFO_EMAIL, 
    PlusScopes.USERINFO_PROFILE 
); 

GoogleAuthorizationCodeFlow flow 
    = new GoogleAuthorizationCodeFlow.Builder(
    transport, 
    JacksonFactory.getDefaultInstance(), 
    "your-client-id.apps.googleusercontent.com", 
    "your-client-secret", 
    applicationScopes).build(); 

String userId = googleTokenResponse.parseIdToken().getPayload().getSubject(); 
Credential credential = flow.createAndStoreCredential(googleTokenResponse, userId); 
HttpRequestFactory requestFactory = transport.createRequestFactory(credential); 

GenericUrl url = new GenericUrl("https://www.googleapis.com/oauth2/v1/userinfo"); 
HttpRequest request = requestFactory.buildGetRequest(url); 
String userIdentity = request.execute().parseAsString(); 

El userIdentity podría tener el siguiente aspecto:

{ 
    "id": "105358994046791627189", 
    "name": "Benny Neugebauer", 
    "given_name": "Benny", 
    "family_name": "Neugebauer", 
    "link": "https://plus.google.com/+BennyNeugebauer", 
    "picture": "https://lh4.googleusercontent.com/-dtvDIXCEtFc/AAAAAAAAAAI/AAAAAAAAAoE/1CKd3nH9rRo/photo.jpg", 
    "gender": "male", 
    "locale": "de" 
} 

Si se desea se puede analizar el userIdentity en su propia clase utilizando Jackson:

ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper(); 
mapper.readValue(userIdentity, YourUser.class); 

Estas son las dependencias que he usado para este ejemplo:

<dependency> 
    <groupId>com.google.apis</groupId> 
    <artifactId>google-api-services-plus</artifactId> 
    <version>v1-rev401-1.22.0</version> 
</dependency> 

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-mapper-asl</artifactId> 
    <version>1.9.13</version> 
    <type>jar</type> 
</dependency> 
Cuestiones relacionadas