5

Tôi hiện đang triển khai quyền truy cập vào Danh bạ Google qua OAuth 2.0 và Tài khoản dịch vụ được gọi là. Tài khoản dịch vụ được tạo cho người dùng thông thường như "[email protected]".Truy cập Api liên hệ của Google qua OAuth 2.0 và khóa cá nhân aka Tài khoản dịch vụ

Mã này để tạo ra OAuth 2.0 thông tin là:

public static GoogleCredential getCredentials() throws GeneralSecurityException, IOException { 
    GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
      .setJsonFactory(JSON_FACTORY) 
      .setServiceAccountId(SingleUserCredentials.SERVICE_ACCOUNT_EMAIL) 
      .setServiceAccountScopes("https://www.google.com/m8/feeds") 
      .setServiceAccountPrivateKeyFromP12File(new File(SingleUserCredentials.SERVICE_ACCOUNT_PKCS12_FILE_PATH)) 
      .build(); 
    credential.refreshToken(); 
    return credential; 
} 

Tôi sau đó cố gắng để lấy lại địa chỉ liên lạc qua:

ContactsService myService = new ContactsService(
      "myApp"); 

    myService.setOAuth2Credentials(getCredentials()); 

    URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full"); 
    Query myQuery = new Query(feedUrl); 
    ContactFeed resultFeed = myService.query(myQuery, ContactFeed.class); 
    // Print the results 

    for (ContactEntry entry : resultFeed.getEntries()) { 
     System.out.println(entry.getName().getFullName().getValue()); 
     System.out.println("Updated on: " + entry.getUpdated().toStringRfc822()); 
    } 

Vấn đề là tôi không nhận được bất kỳ một liên lạc duy nhất từ tài khoản của tôi. Nguồn cấp dữ liệu luôn trống. Không có lỗi. Không có gì.

Khi truy cập miền được quản lý Google Apps thông qua cùng một cách tiếp cận, nó hoạt động độc đáo.

Tôi tự hỏi liệu Api liên hệ có hỗ trợ OAuth 2.0 cho tài khoản thông thường (aka @ gmail.com) khi sử dụng tệp khóa p12 và tài khoản dịch vụ hay không.

Trả lời

1

Tôi cũng đã tự mình gặp phải vấn đề đó.

Tôi đã thử cả địa chỉ email mà tôi nhận được khi tôi thiết lập khóa và địa chỉ email của quản trị viên tên miền.

Khi tôi sử dụng email từ thiết lập khóa, tôi hoàn toàn không nhận được bất kỳ điều gì - không có cảnh báo, không có ngoại lệ và không có dữ liệu.

Khi tôi sử dụng địa chỉ email của quản trị viên miền, tôi nhận được một ngoại lệ:

com.google.api.client.auth.oauth2.TokenResponseException: 400 OK 
    [java] { 
    [java] "error" : "invalid_grant" 
    [java] } 
    [java] Feb 5, 2013 5:16:48 PM com.google.appengine.repackaged.org.apache.http.impl.client.DefaultRequestDirector handleResponse 
    [java] WARNING: Authentication error: Unable to respond to any of these challenges: {} 
    [java] Feb 5, 2013 5:16:48 PM com.google.apphosting.utils.jetty.JettyLogger warn 
    [java] WARNING:/
    [java] java.lang.NullPointerException: No authentication header information 

...

Vì vậy, tôi đã tìm thấy địa chỉ email của quản trị viên miền không phải là những gì tôi cần .

Tiếp theo, tôi đã google khoảng một thời gian trước khi tìm trang này:

http://javadoc.google-api-java-client.googlecode.com/hg/1.13.2-beta/com/google/api/client/googleapis/auth/oauth2/GoogleCredential.html

tôi thấy trong đó getServiceAccountUser(). Mô tả của trường là:

Trả lại địa chỉ email của người dùng mà ứng dụng đang cố mạo danh trong luồng tài khoản dịch vụ hoặc không có giá trị hoặc không sử dụng luồng tài khoản dịch vụ.

Chắc chắn, có một setServiceAccountUser (Chuỗi) tương ứng chấp nhận tên người dùng (địa chỉ email) của người dùng bạn đang sử dụng tài khoản dịch vụ để mạo danh.

Tôi đặt trường đó thành giá trị phù hợp và tôi có thể tiếp tục.

Nhìn lại, tất cả đều có ý nghĩa - nếu tôi không cung cấp tài khoản mà tôi đang cố gắng làm việc, tôi không thể kéo liên hệ cho tài khoản đó.

+0

Xin chào, cảm ơn câu trả lời. Tuy nhiên, bạn đang mô tả cách tiếp cận cho quyền truy cập OAuth 2.0 dựa trên khóa vào một miền. Điều đó làm việc tốt cho tôi như mô tả ở trên. Những gì tôi thực sự tìm kiếm là một giải pháp để truy cập danh bạ thông qua một người dùng thông thường như [email protected] - không có miền được quản lý của Google. Tôi hy vọng câu hỏi của tôi ở trên có ý nghĩa trong vấn đề đó. –

0

Hiện tại, bạn không thể truy cập Danh bạ bằng tài khoản dịch vụ vì nó không được hỗ trợ trong Bảng điều khiển API Google tại Google APIs Console.

Xem thêm: Service Accounts

Thứ hai, nó sẽ chỉ làm việc với một miền quản lý Google vì quản trị của tên miền phải cấp quyền truy cập vào tài khoản dịch vụ thông qua quá trình dưới đây:

Đại biểu miền toàn quyền đối với tài khoản dịch vụ của bạn

Tài khoản dịch vụ bạn đã tạo bây giờ cần được cấp quyền truy cập vào dữ liệu người dùng của miền Google Apps mà bạn muốn truy cập. Các tác vụ sau phải được thực hiện bởi quản trị viên miền Google Apps:

  1. Chuyển đến bảng điều khiển miền Google Apps của bạn. URL phải giống như sau: "www.google.com/a/cpanel/mydomain.com"

  2. Đi tới Công cụ nâng cao ...> Quản lý quyền truy cập của Khách hàng OAuth của bên thứ ba.

  3. Trong trường Tên khách hàng, hãy nhập ID ứng dụng của tài khoản dịch vụ.

  4. Trong trường Một hoặc nhiều phạm vi API nhập danh sách phạm vi mà ứng dụng của bạn sẽ được cấp quyền truy cập.

  5. Nhấp vào nút Ủy quyền.

+0

Không chắc chắn nếu tôi có thể đồng ý. API danh bạ cũng không có sẵn trong API Console - nhưng nó hoạt động trên các miền. Về mặt lý thuyết, điều này cũng nên hoạt động trên các tài khoản gmail thông thường. Và liên quan đến tài khoản dịch vụ - khái niệm đó hoạt động cho các tài khoản đơn lẻ. Chúng tôi đã thử nghiệm với Lịch Api và Drive. Và cuối cùng - điều thực sự kỳ lạ là chúng tôi không nhận được bất kỳ thông báo lỗi nào. Chúng tôi chỉ không nhận được dữ liệu. Trông giống như một con bọ? –

+0

Tôi đã thử phương pháp này trước khi tìm câu trả lời này nhưng đối với tôi nó không hoạt động. Tôi đang sử dụng - như một phạm vi - 'https: // www.google.com/m8/feeds' (liên hệ R/W) nhưng không có niềm vui. Tôi nhận thấy rằng phạm vi cho các dịch vụ được "nhận ra" và tên thân thiện với con người của chúng được hiển thị bên cạnh URI, nhưng điều đó không xảy ra với điều khoản trên. Tôi nghi ngờ nó chỉ đơn giản là không được hỗ trợ. – mac

+0

@mac Tôi đã có cùng với URL này không được công nhận. Tuy nhiên, nếu bạn thêm dấu gạch chéo vào cuối, nó sẽ được nhận dạng. (không may mắn khi thực sự gọi API mặc dù ...) – Geert

0

tôi đã chạy ngang qua lỗi này rất giống hiện nay nhưng đã từ bỏ việc sử dụng tài khoản Dịch vụ cho bây giờ, mà tôi cho rằng hiện không được hỗ trợ trong giao diện Danh bạ API. Và vì vậy tôi đang sử dụng API danh bạ v3 với OAuth 1.0 và đang nhận được kết quả mong đợi.

ContactsService contactsService = new ContactsService(APPLICATION_NAME); 
contactsService.setUserCredentials(CLIENT_USERNAME, CLIENT_SECRET); 

URL contactFeedURL = new URL("https://www.google.com/m8/feeds/contacts/default/full"); 
Query contactFeedQuery = new Query(contactFeedURL); 

ContactFeed contactFeed = contactsService.getFeed(contactFeedQuery, ContactFeed.class); 
+0

Cảm ơn :) Rất vui được biết. OAuth 1.0 cũng đang làm việc cho chúng tôi. OAuth 2.0 vẫn không hoạt động với chứng chỉ p12 ... –

+0

Hy vọng nó sẽ sớm được hỗ trợ. Tôi biết điều này đã không trả lời câu hỏi của bạn, nhưng tôi nghĩ rằng nó có thể hữu ích cho ai đó đang tìm cách thức dậy và chạy với Danh sách liên hệ. – rposky

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