2014-11-04 66 views
1

我正嘗試使用服務帳戶訪問安裝了我的應用的域(通過Google Apps Marketplace)的數據。如何在不知道該域名的電子郵件的情況下使用服務帳戶獲取Google Apps域中用戶的電子郵件?

但爲了獲取給定域的用戶列表或管理員列表,調用Google Admin SDK api似乎需要知道域中用戶的電子郵件地址。

https://developers.google.com/admin-sdk/directory/v1/guides/delegation#instantiate_an_admin_sdk_directory_service_object

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擺在首位呢?在不知道域中的電子郵件的情況下,您無法獲取域中的電子郵件列表。您可能會存儲首次安裝應用程序的管理員的電子郵件 - 但這似乎不合適,並且不足。如果此管理員的帳戶被刪除或電子郵件地址更改會怎麼樣?

回答

2

服務帳戶無法授予域上的管理員權限;他們必須模仿一個域管理員,因此需要一個電子郵件地址。推薦的方法是存儲安裝該應用程序的管理員的電子郵件,或者有一個配置屏幕,他們可以在其中設置要使用的管理員帳戶的電子郵件。正如你所指出的,如果管理員帳戶被刪除或電子郵件發生變化,這種方法可能會有點脆弱。確保你處理這種情況,禁用應用程序並提醒用戶管理員必須重新配置它。

+0

謝謝埃裏克。你的回答明確了在目前的限制下必須做些什麼。但它不是非常優雅的用戶體驗。我仍然認爲Google應該提供某種方式來合法地以應用程序的方式訪問API資源,而不是以用戶身份訪問。 – 2014-11-13 04:34:08

+0

當一些其他用戶訪問應用程序時,如何找到存儲的目標域管理員?通過域名從電子郵件地址?如果情況如下:主域管理員安裝應用程序,用戶從二級域(同一個Google應用程序客戶(Id))訪問 - 沒有域匹配,並且customerId屬性對非管理員不可見。 – user3686724 2015-10-09 12:05:55

+0

您可以使用Admin SDK Directory API來查找給定用戶的客戶ID,並將其用作主鍵而不是域名。 – 2015-10-19 13:19:45

相關問題