2017-04-16 84 views
1

我試圖使用具有服務帳戶憑據和Java SDK(v1.22.0)的Gmail API訪問我自己的個人Gmail帳戶。我已經生成的證書和本地保存JSON文件,然後試圖運行以下命令:使用Java SDK返回400的Google Gmail API請求

公共類GmailAPITest {

public static void main(String[] args) throws Exception { 
    JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); 
    HttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); 

    String filepath = "/path/to/my/creds.json"; 

    GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream(filepath)) 
      .createScoped(Collections.singleton(GmailScopes.GMAIL_READONLY)); 

    Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) 
      .setApplicationName("MyApp") 
      .build(); 

    String user = "me"; 
    ListLabelsResponse listResponse = service.users().labels().list(user).execute(); 
    List<Label> labels = listResponse.getLabels(); 

    if (labels.size() == 0) { 
     System.out.println("No labels found."); 
    } else { 
     System.out.println("Labels:"); 
     for (Label label : labels) { 
      System.out.printf("- %s\n", label.getName()); 
     } 
    } 
} 

我得到一個400迴應是這樣的:

{ 
    "code" : 400, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "Bad Request", 
    "reason" : "failedPrecondition" 
    } ], 
    "message" : "Bad Request" 
} 
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146) 
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113) 
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40) 
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321) 
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065) 
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) 
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 
at ie.test.GmailAPITest.main(GmailAPITest.java:34) 

我已經嘗試啓用服務憑據的域範圍委派,並且我已嘗試將用戶「我」更改爲我的帳戶的電子郵件地址,但這是相同的結果。我也看到了許多類似問題的問題,但我沒有發現它們有用。我錯過了什麼嗎?

Gmail API已在開發者控制檯中啓用,從那裏我可以看到所有失敗的4xx請求。

我還應該提到,我已經使用Python創建了另一個測試,它使用相同的服務憑證執行完全相同的操作,並且它以相同的400錯誤失敗。我試着在同一個安全證書下創建一個新的密鑰(json)並嘗試使用它,但它是相同的結果。


我已經能夠得到的東西的工作,但只能通過使用可替代的OAuth登錄過程中即被提示允許/拒絕從網絡瀏覽器,然後保存一些OAuth訪問令牌訪問未來用戶的文件。這並不理想,因爲我將不得不不斷更新這些令牌。服務憑據大概是爲了避免確切的問題而創建的。我仍然很想知道爲什麼它不適合我。

回答

1

服務帳戶域範圍委派僅適用於G Suite帳戶,並要求G Suite管理員授權服務帳戶客戶端ID有權訪問必要的範圍。如果您正在使用消費者Gmail帳戶(@ gmail.com地址),或者您沒有G Suite管理員批准,那麼您應該使用正常工作的正常OAuth流程。

相關問題