2012-07-22 15 views
6

Lỗi mà tôi đang nhận được:Nhận UserInfo từ OAuth2 Google Contacts 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" 
} 

Dưới mã, tôi đang sử dụng:

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

Đến đây, tôi nhận được Refresh thẻ, truy cập Token, vv

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

Nó không ở bên dưới dòng: (Dont know, tại sao?)

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

Tôi đã tìm kiếm trên web và tôi nhận được rất ít ví dụ về tài liệu và tài liệu quý hiếm. Bất kỳ cơ thể nào cũng có ý tưởng về nó?

Tôi đang làm gì sai?

Trả lời

5

Tôi đoán credential.getRequestInitializer() is null.

Tôi đã giải quyết điều này bằng cách thiết lập một initializer yêu cầu tùy chỉnh để các đối tượng chứng như documentation especifies này

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

của Google như sau:

** Ví dụ, một cuộc gọi đến UserInfo API sử dụng tham số chuỗi truy vấn access_token trông giống như sau:

GET https://www.googleapis.com/oauth2/v1/userinfo?access_token= {accessToken} Cuộc gọi đến cùng API bằng quyền truy cập vào ken trong tiêu đề HTTP trông giống như sau:

GET/oauth2/v1/userinfo HTTP/1.1 Cấp phép: Bearer {accessToken} Máy chủ: googleapis.com **

Hy vọng điều này sẽ giúp bạn

+0

Hoàn hảo! Cảm ơn Javiercbk. –

0

Để lấy dữ liệu từ API UserInfo bạn phải yêu cầu quyền truy cập vào phạm vi OAuth của nó:

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

Ngoài ra thêm phạm vi https://www.googleapis.com/auth/userinfo.email nếu bạn muốn lấy địa chỉ email.

Trong mã của bạn, tôi không thấy nơi bạn đặt phạm vi OAuth mà bạn đang yêu cầu quyền truy cập.

+0

Tôi đã nói thêm rằng phạm vi cũng ... và nó làm việc tốt ... Sau khi truy cập cấp i thất bại để có được câu trả lời cần thiết. Vì vậy, trong ngắn hạn, tôi bao gồm phạm vi email là tốt. –

1

Nếu bạn đã có được thẻ truy cập (GoogleTokenResponse), sau đó bạn cũng có thể làm điều này:

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

Các userIdentity sau đó sẽ trông như thế này:

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

Nếu bạn muốn bạn có thể phân tích cú pháp userIdentity vào lớp học của riêng bạn bằng cách sử dụng Jackson:

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

Dưới đây là các phụ thuộc mà tôi sử dụng cho ví dụ này:

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