6

EDYCJA: Pierwotnie to pytanie zadano pytanie, w jaki sposób mogę uwierzytelnić się za pomocą interfejsu API Google Analytics za pomocą wyłącznie mojego klucza API. Jako vlatko pointed out, nie jest to możliwe. Teraz koncentruję się tylko na tym, aby OAuth2 działało. Będę próbować sugestii Vlatko, kiedy dostanę szansę i zaktualizuję pytanie. W międzyczasie możesz udzielić odpowiedzi na wszystko, czego Twoim zdaniem brakuje.Google Analytics 3.0 autoryzacja


oryginalne pytanie:

Próbuję zrobić żądań do API Google Analytics. Przechodzę przez samouczek Hello Analytics, próbując replikować kroki. Cokolwiek próbuję, nie mogę wydawać się uwierzytelniać z powodzeniem.

Tutorial mówi co następuje:

Otwórz plik utworzony nazwie HelloAnalyticsApi.java i dodać następującą metodę:

private static Analytics initializeAnalytics() throws Exception { 
    // Authorization. 
    Credential credential = OAuth2Native.authorize(
     HTTP_TRANSPORT, JSON_FACTORY, new LocalServerReceiver(), 
     Arrays.asList(AnalyticsScopes.ANALYTICS_READONLY)); 

    // Set up and return Google Analytics API client. 
    return Analytics.builder(HTTP_TRANSPORT, JSON_FACTORY) 
     .setApplicationName("Google-Analytics-Hello-Analytics-API-Sample") 
     .setHttpRequestInitializer(credential) 
     .build(); 
    } 

Kiedy użytkownik napotka ten skrypt, aplikacja będzie próbować otwórz domyślną przeglądarkę i przejdź do adresu URL hostowanego pod adresem google.com. W tym momencie użytkownik zostanie poproszony o zalogowanie się i uzyska dostęp aplikacji do ich danych. Po zatwierdzeniu aplikacja spróbuje odczytać kod z okna przeglądarki, a następnie zamknie okno.

Różnica polega na tym, że próbuję to zrobić za pomocą aplikacji serwletów i chcę używać prostego dostępu API za pomocą klucza API (zamiast identyfikatora klienta OAuth 2.0). Wiem, że zalecany jest OAuth 2.0, ale potrzebuję tylko dostępu do danych, które posiadam i chcę uprościć wymagania techniczne. I na podstawie tej decyzji na this page, który mówi:

klucz API jest unikalnym kluczem, który można wygenerować za pomocą konsoli. Kiedy Twoja aplikacja musi wywołać API, które jest włączone w tym projekcie, , aplikacja przekazuje ten klucz do wszystkich żądań API jako parametr key={API_key} . Użycie tego klucza nie wymaga żadnych działań użytkownika ani zgody użytkownika, nie daje dostępu do żadnych informacji o koncie i nie jest używane do autoryzacji.

Jeśli dzwonisz tylko API, które nie wymagają danych użytkownika, takich jak Google Custom Search API, to klucze API może być prostsze wdrożenia. Jeśli jednak aplikacja używa już tokenu dostępu OAuth 2.0 , nie ma potrzeby generowania klucza API. W przypadku Google ignoruje przekazane klucze interfejsu API, jeśli token dostępu OAuth 2.0 to już powiązany z odpowiednim projektem.

nie mogę znaleźć wiele przykładów kodu przepływu auth tylko za pomocą klucza API - najbardziej wszystko Znalazłem pokazy z wykorzystaniem identyfikatora klienta z pobranego pliku .p12, na przykład GoogleCredential javadoc. Jedyną przykładową aplikacją, jaką mogłem znaleźć, była aplikacja Google'a Books Sample.W każdym razie, oto co próbowałem (naśladując pierwsze żądanie w tutorialu, który pobiera listę kont z API zarządzania):

Analytics analytics = 
     new Analytics.Builder(httpTransport, jsonFactory, null) 
     .setApplicationName("Dev API Access") 
     .build(); 
Management.Accounts.List list = 
     analytics.management().accounts().list().setKey(apiKey); 
Accounts accounts = list.execute(); 

Gdzie „Dev API dostępu” jest „Nazwa” pole w moim API pulpit konsoli. Klucz API jest kluczem serwera ograniczonym do mojego adresu IP. To nie z następującą odpowiedź:

401 Unauthorized 
{ 
    "code": 401, 
    "errors": [ 
    { 
     "domain": "global", 
     "location": "Authorization", 
     "locationType": "header", 
     "message": "Login Required", 
     "reason": "required" 
    } 
    ], 
    "message": "Login Required" 
} 

ja też próbowałem to:

Analytics analytics = 
     new Analytics.Builder(httpTransport, jsonFactory, null) 
     .setApplicationName("Dev API Access") 
     .setGoogleClientRequestInitializer(new AnalyticsRequestInitializer(apiKey)) 
     .build(); 

Management.Accounts.List list = analytics.management().accounts().list(); 
Accounts accounts = list.execute(); 

który pokazuje ten sam błąd. Co ja tu robię źle? Czy do wywołań analitycznych wymagany jest OAuth2? Jeśli tak, dlaczego właśnie użycie klucza API działa w aplikacji Sample książek?


Idąc dalej, poszedł do przodu i próbował OAuth2 każdym razie - ja stworzył identyfikator klienta i pobrać plik klucza prywatnego .p12. Ale ja też nie mogłem tego zrobić. Oto, co starałem:

Credential credential = 
     new GoogleCredential.Builder() 
     .setTransport(httpTransport) 
     .setJsonFactory(jsonFactory) 
     .setServiceAccountId(serviceAccountId) 
     .setServiceAccountScopes(AnalyticsScopes.ANALYTICS_READONLY) 
     .setServiceAccountPrivateKeyFromP12File(new File(p12FilePath)) 
     .setServiceAccountUser(serviceAccountUser) 
     .build(); 

Analytics analytics = 
     new Analytics.Builder(httpTransport, jsonFactory, credential) 
     .setApplicationName("Dev API Access") 
     .build(); 

Management.Accounts.List list = analytics.management().accounts().list(); 
Accounts accounts = list.execute(); 

Gdzie serviceAccountId jest adres e-mail konta Google posiadającej projekt i serviceAccountUser jest adres e-mail wymieniony na wygenerowanym ID klienta. To nie powiedzie się z następujących czynności:

400 Bad Request 
{ 
    "error": "invalid_grant" 
} 

Co oznacza „nieważny grant” znaczy, i jak mogę skutecznie uwierzytelnić (najlepiej bez OAuth2)?

Odpowiedz

3

Aby odpowiedzieć na pierwsze pytanie: w ogóle, OAuth2.0 służy do autoryzowanego dostępu do prywatnych danych użytkownika, więc uzyskanie zgody użytkownika i uzyskania wymagane jest token dostępu. W przypadku książek Google API, jeśli jednak masz dostęp do danych publicznych, nie ma potrzeby zgody użytkownika końcowego więc klucz API jest wystarczające. Jeśli spróbujesz uzyskać dostęp do danych niepublicznych za pomocą interfejsu Books API, nadal potrzebujesz tokenu OAuth2.

Dobrą wiadomością dla Twojego przypadku jest to, że nawet przy OAuth2 możesz ominąć zaangażowanie użytkownika i usprawnić przepływ dzięki Kontom usług - zakładając, że twoja aplikacja ma dostęp do API. Jest na to sposób, aby ustawić, że się za pomocą interfejsu API Analytics, wyjaśnił here (sprawdź kroki opisane w sekcji Konta serwisowe). Myślę, że jesteś na dobrej drodze ze swoim Credential konstruktora, ale nie sądzę, trzeba ustawić konto użytkownika usług tam, ponieważ nie robią żadnego personifikacji użytkownika.

+0

+1 Dzięki za wyjaśnienie o klucz API. Zrobiłem błędne założenia dotyczące interfejsu API Książki, gdy używam go jako punktu odniesienia. Zaktualizuję pytanie, by skupić się tylko na problemie OAuth2. Nie miałem jeszcze okazji sprawdzić Twojego linku. –

+0

Gotowy do pracy - dziękuję za pomoc! Zobacz moją odpowiedź poniżej, aby uzyskać szczegółowe informacje. –

3

vlatko's answer masz mnie na właściwe tory. Problem polegał na tym, że myliłem adres e-mail właściciela z adresem e-mail konta usługi. Na przykład, robiłam następujące:

Credential credential = 
    new GoogleCredential.Builder() 
    .setTransport(httpTransport) 
    .setJsonFactory(jsonFactory) 
    .setServiceAccountId("[email protected]")     //wrong 
    .setServiceAccountScopes(AnalyticsScopes.ANALYTICS_READONLY) 
    .setServiceAccountPrivateKeyFromP12File(new File(p12FilePath)) 
    .setServiceAccountUser("[email protected]") //unnecessary 
    .build(); 

Kiedy potrzebowałem, aby to zrobić:

Credential credential = 
    new GoogleCredential.Builder() 
    .setTransport(httpTransport) 
    .setJsonFactory(jsonFactory) 
    .setServiceAccountId("[email protected]") 
    .setServiceAccountScopes(AnalyticsScopes.ANALYTICS_READONLY) 
    .setServiceAccountPrivateKeyFromP12File(new File(p12FilePath)) 
    .build(); 

Również miałem dodaną [email protected] jako użytkownik na mojej aplikacji Analytics - to potrzebne podobnie być zamiast tego e-mail konta usługi.

Powiązane problemy