我正嘗試使用服務帳戶訪問安裝了我的應用的域(通過Google Apps Marketplace)的數據。如何在不知道該域名的電子郵件的情況下使用服務帳戶獲取Google Apps域中用戶的電子郵件?
但爲了獲取給定域的用戶列表或管理員列表,調用Google Admin SDK api似乎需要知道域中用戶的電子郵件地址。
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(DirectoryScopes.ADMIN_DIRECTORY_USERS)
.setServiceAccountUser(userEmail)
.setServiceAccountPrivateKeyFromP12File(
new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
.build();
Directory service = new Directory.Builder(httpTransport, jsonFactory, null)
.setHttpRequestInitializer(credential).build();
Directory.Users.List request = service.users().list().setDomain(domain);
上述工作,但需要你號召建設者的setServiceAccountUser(userEmail)
方法。沒有這一點,當你執行請求時,你會得到一個403「未授權的資源/ API錯誤」。這由幾個現有問題記錄,如Google Apps Admin API: need to specify account user for service account?。
但你怎麼知道userEmail
擺在首位呢?在不知道域中的電子郵件的情況下,您無法獲取域中的電子郵件列表。您可能會存儲首次安裝應用程序的管理員的電子郵件 - 但這似乎不合適,並且不足。如果此管理員的帳戶被刪除或電子郵件地址更改會怎麼樣?
謝謝埃裏克。你的回答明確了在目前的限制下必須做些什麼。但它不是非常優雅的用戶體驗。我仍然認爲Google應該提供某種方式來合法地以應用程序的方式訪問API資源,而不是以用戶身份訪問。 – 2014-11-13 04:34:08
當一些其他用戶訪問應用程序時,如何找到存儲的目標域管理員?通過域名從電子郵件地址?如果情況如下:主域管理員安裝應用程序,用戶從二級域(同一個Google應用程序客戶(Id))訪問 - 沒有域匹配,並且customerId屬性對非管理員不可見。 – user3686724 2015-10-09 12:05:55
您可以使用Admin SDK Directory API來查找給定用戶的客戶ID,並將其用作主鍵而不是域名。 – 2015-10-19 13:19:45