2014-12-17 14 views
7

Tôi nhận được NullPointerException với rất ít chi tiết khi tôi cố gắng setServiceAccountUser(ACCOUNT_TO_IMPERSONATE) trên GoogleCredential của mình, tạo đối tượng dịch vụ Google Tasks và sau đó cố gửi yêu cầu danh sách Công việc từ ACCOUNT_TO_IMPERSONATE.NullPointerException chỉ sau khi tôi đã setServiceAccountUser() cho đối tượng GoogleCredential (Grails/Java)

def credential = new GoogleCredential.Builder() 
    .setTransport(HTTP_TRANSPORT) 
    .setJsonFactory(JSON_FACTORY) 
    .setServiceAccountId(SERVICE_ACCOUNT_ID) 
    .setServiceAccountPrivateKeyFromP12File(P12_FILE) 
    .setServiceAccountScopes(GOOGLE_TASK_SCOPES) 
    .setServiceAccountUser(ACCOUNT_TO_IMPERSONATE) 
    .build() 

    credential.refreshToken() 
    log.debug("Google Credential Impersonating: ${credential.getServiceAccountUser()}") 

    def service = new com.google.api.services.tasks.Tasks.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build() 

    return service 

Xin lưu ý rằng credential.getServiceAccountUser() đăng xuất dự kiến ​​ACCOUNT_TO_IMPERSONATE.

Có một vấn đề tương tự được báo cáo trong https://github.com/googleads/googleads-java-lib/issues/19

StackTrace : 
Caused by: java.lang.NullPointerException at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkNotNull(Preconditions.java:191) 
at com.google.api.client.util.Preconditions.checkNotNull(Preconditions.java:127) 
at com.google.api.client.json.jackson2.JacksonFactory.createJsonParser(JacksonFactory.java:96) 
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:85) 
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81) 
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:88) 
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.auth.oauth2.Credential.executeRefreshToken(Credential.java:570) 
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:247) 
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489) 
at com.google.api.ads.common.lib.auth.OAuth2Helper.callRefreshToken(OAuth2Helper.java:70) 
at com.google.api.ads.common.lib.auth.OfflineCredentials.generateCredential(OfflineCredentials.java:144) 
... 

Việc thiếu chi tiết trong các lỗi được cho là một vấn đề trong các phiên bản cũ của Google Task nhưng tôi đã nâng cấp lên phiên bản mới nhất và thấy không có sự khác biệt .

compile "com.google.api-client:google-api-client:1.19.0" 
compile 'com.google.apis:google-api-services-tasks:v1-rev41-1.19.0' 

EDIT: Sau khi mày mò với mã kiểm tra vào grails console trong ứng dụng web của chúng tôi Tôi có thể thấy rằng thực hiện credential.refreshToken() làm cho NPE khi ServiceAccountUser được thiết lập.

Khi tôi bỏ đặt số ServiceAccountUser, refreshToken() thành công. Ngoài ra, việc cố gắng truy xuất danh sách Công việc của Google rất thành công đối với tài khoản Dịch vụ khi không đặt được ServiceAccountUser.

Mọi trợ giúp sẽ được đánh giá cao.

+0

Bạn đã xem điều này? http://stackoverflow.com/questions/12479551/google-drive-oauth-cant-figure-out-how-to-get-re-usable-googlecredentials – user1807337

Trả lời

2

Tôi đã phát hiện ra lý do cho hành vi mà chúng tôi gặp phải, nhưng cảm ơn các đề xuất của bạn, không có-ít-hơn, user1807337 & Srinivasan.

Chúng tôi cần để người dùng ứng dụng của chúng tôi ủy quyền cho toàn bộ miền cho ứng dụng của chúng tôi. Điều này có thể được thực hiện bằng google của organisataion ứng dụng admin, theo các hướng dẫn trong các tiểu phần có tiêu đề Ủy nhiệm quyền miền toàn cho tài khoản dịch vụ

https://developers.google.com/accounts/docs/OAuth2ServiceAccount

Dưới đây là lời giải thích được đưa ra trong các tài nguyên giống nhau: "Nếu bạn đã ủy quyền truy cập toàn miền cho tài khoản dịch vụ và bạn muốn mạo danh tài khoản người dùng, hãy chỉ định địa chỉ email của tài khoản người dùng với phương thức setServiceAccountUser của nhà máy GoogleCredential ..."

0

Hãy thử

'com.google.api.client.googleapis.auth.oauth2.GoogleCredential.Builder credential_origine_builder = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
       .setJsonFactory(JSON_FACTORY) 
       .setServiceAccountId("[[]]") 
       .setServiceAccountScopes(GOOGLE_TASK_SCOPES) 
       .setServiceAccountPrivateKeyFromP12File(new File("cfg/file.p12")); 

credential_origine_builder.setServiceAccountUser này ("[email protected]");'

+1

Chúng tôi có thể xác thực bằng thông tin đăng nhập tài khoản dịch vụ của chúng tôi, sự cố là chúng tôi không thể mạo danh người dùng khác thuộc miền của chúng tôi. – rcgeorge23

Các vấn đề liên quan