2012-07-22 16 views
6

Fehler, die ich erhalte:Get Userinfo von OAuth2 Google Kontakte API

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" 
} 

Im Folgenden Code, ich bin mit:

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()); 

Bis hier, ich Refresh-Token erhalten, Zugriffstoken, etc

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

Es scheitert an unter der Linie: (Dont wissen, warum?)

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

Ich suchte im Internet, und ich bekomme sehr weniger Beispiele dafür und seltene Materialien. Jeder Körper hat eine Idee dazu?

Was mache ich falsch?

Antwort

5

Ich schätze credential.getRequestInitializer() ist null.

ich das habe, indem eine individuelle Anfrage initializer auf das Credential-Objekt wie dieses

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() 
documentation especifies folgende

Googles gelöst:

** Zum Beispiel kann ein Aufruf an die API Userinfo Der Abfragezeichenfolgenparameter access_token sieht wie folgt aus:

GET https://www.googleapis.com/oauth2/v1/userinfo?access_token= {accessToken} Ein Aufruf der gleichen API über den Zugriff auf ken im HTTP-Header sieht wie folgt aus:

GET/oauth2/v1/userinfo HTTP/1.1 Berechtigung: Bearer {accessToken} Host: googleapis.com **

hoffe, dies wird Ihnen helfen,

+0

Perfekt! Danke Javiercbk. –

0

Um Daten aus dem Userinfo API Sie Zugriff auf seine OAuth Umfang haben abzurufen anfordern:

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

auch den Umfang hinzufügen https://www.googleapis.com/auth/userinfo.email, wenn Sie die E-Mail-Adresse abrufen möchten.

In Ihrem Code sehe ich nicht, wo Sie die OAuth-Bereiche festlegen, auf die Sie zugreifen möchten.

+0

Ich habe hinzugefügt, dass Umfang und ... und seine adaequat ... Nach der Erteilung Zugang i nicht erforderlich Antwort zu erhalten. Kurz gesagt, ich habe auch den Umfang der E-Mail eingeschlossen. –

1

Wenn Sie bereits das Zugriffstoken erhalten (GoogleTokenResponse) können Sie dann dies auch tun:

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(); 

Die userIdentity würde wie folgt aussehen dann:

{ 
    "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" 
} 

Wenn Sie möchten, können Sie die userIdentity in Ihre eigene Klasse mit Jackson analysieren:

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

Hier sind die Abhängigkeiten, die ich für dieses Beispiel verwendet:

<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> 
Verwandte Themen