2016-08-10 32 views
19

Po tym poście: http://android-developers.blogspot.com/2016/01/play-games-permissions-are-changing-in.html Otrzymałam jeden kod autoryzacji Zastosowanie Na moim serwerze backend następująco:Dlaczego funkcja GetServerAuthCodeResult jest przestarzała? Jak mogę zrobić coś podobnego w zainstalowanej aplikacji?

import com.google.android.gms.games.Games;  
//later 
Games.GetServerAuthCodeResult result = Games.getGamesServerAuthCode(gameHelper.getApiClient(), server_client_id).await(); 
if (result.getStatus().isSuccess()) { 
    String authCode = result.getCode(); 
    // Send code to server... 

Wydaje się to działa dobrze, ale prezentuje się pytanie:

1) getGamesServerAuthCode i GetServerAuthCodeResult są oznaczone jako przestarzałe. Czemu? Czy powinienem zamiast tego używać czegoś innego?

2) Jak zrobić coś podobnego w zainstalowanej aplikacji Java bez Androida? Jestem w stanie uzyskać token w aplikacji klienckiej, ale muszę też uzyskać kod jednorazowego użytku, który przekazuję na mój serwer backendu, jak wyżej. Nie mogę znaleźć równoważnej funkcji, aby uzyskać kod uwierzytelniania serwera. (używając com.google.api.client.extensions.java6.auth.oauth2)

W zasadzie próbuję podążać za tym przepływem: https://developers.google.com/games/services/web/serverlogin, ale w Javie, NIE JavaScript. Próbuję to zrobić w aplikacji na Androida i aplikacji Java na komputery.

+1

Program adnotacją @Deprecated jest, że programiści są zniechęceni do korzystania, zwykle dlatego, że jest niebezpieczne, albo dlatego, że istnieje lepsza alternatywa. Kompilatory ostrzegają, gdy nieużywany element programu zostanie użyty lub nadpisany w niezaakceptowanym kodzie. Nie oznacza to, że zniknie, zostanie usunięty lub w ogóle usunięty, oznacza to, że istnieje LEPSZY sposób na zrobienie tego. Nie panikuj, zachowaj spokój i nie przestawaj, O) –

+0

Rozumiem to. Szukam "właściwego" sposobu robienia rzeczy w systemie Android, ponieważ całkiem niedawno (styczeń) google sugerował używanie tej funkcji. Mam dodatkowy problem o porównywalnej funkcji nieistniejącej w wersji api Java w wersjach innych niż Android. – M1LKYW4Y

+1

@ M1LKYW4Y Czy znalazłeś "właściwy" sposób robienia tego, co chciałeś (1)? Jestem dokładnie w tym samym punkcie mojego rozwoju. Wydawało się, że Google ostatnio zaleca takie podejście, ale podejście wydaje się już przestarzałe! – Antinous

Odpowiedz

0

Istnieje wreszcie poprawna odpowiedź na część 1) tego pytania! W uwagach do wydania gms 10.2.0 https://developers.google.com/android/guides/releases#february_2017_-_v102 opisano nową metodę uzyskiwania kodu serwera. Dobrym przykładem tego jest tutaj: https://github.com/playgameservices/clientserverskeleton
Skończyło się na aktualizacji Google baseGameUtils, aby postępować zgodnie z powyższym przykładem.

Nadal nie jestem pewien, jak to zrobić dla części 2) pytania, w tej chwili wysyłam token do serwera, który działa, ale prawdopodobnie nie jest bezpieczny.

0

1) Tak, w przypadku korzystania z Androida GetServerAuthCodeResult, mimo że nadal jest oznaczony jako przestarzały. Jest to zalecana metoda od Google i wygląda na to, że zapomnieli oni usunąć adnotację o wycofaniu po jej udostępnieniu publicznie.

2) W przypadku zastosowań stacjonarnych można postępować zgodnie z instrukcjami tutaj: https://developers.google.com/identity/protocols/OAuth2InstalledApp

Zasadniczo z aplikacji otworzyć przeglądarkę systemową (wbudowany WebViews są zniechęceni) i złożyć wniosek https do punktu końcowego https://accounts.google.com/o/oauth2/v2/auth. W żądaniu podajesz parametr lokalnego identyfikatora URI przekierowania, tj. http://127.0.0.1:9004 (powinieneś zapytać swoją platformę o odpowiedni adres IP pętli zwrotnej i uruchomić odbiornik HTTP na losowym dostępnym porcie). Kod autoryzacji zostanie wysłany do lokalnego odbiornika HTTP, gdy użytkownik wyrazi zgodę lub błąd, taki jak error=access_denied, jeśli użytkownik odrzucił żądanie. Twoja aplikacja musi nasłuchiwać na tym lokalnym serwerze sieciowym, aby pobrać odpowiedź z kodem uwierzytelniającym. Możesz także przekierować do identyfikatora URI serwera bezpośrednio zgłoszonego przez Twoją aplikację, zobacz dokumentację na powyższym linku. Gdy aplikacja otrzyma odpowiedź autoryzacyjną, dla najlepszej użyteczności powinna odpowiedzieć na stronie HTML, nakazując użytkownikowi zamknięcie karty przeglądarki i powrót do aplikacji. Ponadto, jeśli chcesz, aby gra-zakres upewniał się, że używasz zakresu https://www.googleapis.com/auth/games jako zakresu w żądaniu, przykład poniżej, z podziałem linii i spacji dla czytelności.

https://accounts.google.com/o/oauth2/v2/auth? 
    scope=https://www.googleapis.com/auth/games& 
    redirect_uri=http://127.0.0.1:9004& 
    response_type=code& 
    client_id=812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com 

Należy pamiętać, że myślę, że trzeba utworzyć i połączyć aplikację typu other w Google Developer Console Zagraj połączonego-app, na przekierowanie localhost do pracy. Jeśli chcesz bezpośrednio przekierować się do identyfikatora URI serwera, użyj typu: Web. Dodaj identyfikator URI serwera do Authorized redirect URIs w Menedżerze interfejsów API w sekcji Credentials.

Browser screenshot: Element

consent picture

+0

Proszę wybaczyć moją ostrożność, ale skąd wiadomo, że kod w 1) jest rzeczywiście polecany przez Google, a wycofanie jest nieprawidłowe? Czy źródłem jest ten sam artykuł, który podłączyłem na górze? – M1LKYW4Y

+1

Cóż, nie jestem pewien, stąd użycie "wydaje się", ale właśnie to Clayton Wilkinson (inżynier programista) w Google mówi: "Najlepszym sposobem na poradzenie sobie z tym jest ..." i "to będzie być normalnym API ". I nie było nic więcej po ogłoszenia o tym problemie z Google. Ponadto, jest to obecnie jedyny sposób na pobranie kodu autorskiego na Androida. Wątpię, by usunęli go w najbliższym czasie. To by przerwało wiele gier, w zależności od funkcji logowania z własnym serwerem zaplecza. – jbilander