Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą ich kont Google na urządzeniach z ograniczonymi możliwościami wprowadzania danych, takich jak telewizory z dostępem do internetu.
Aplikacja wyświetla użytkownikowi krótki kod i adres URL logowania. Następnie użytkownik otwiera adres URL logowania w przeglądarce, wprowadza kod i daje aplikacji uprawnienia do dostępu do swoich danych logowania. Na koniec aplikacja otrzymuje potwierdzenie i użytkownik loguje się.
Aby można było skorzystać z tego procesu logowania, aplikacja musi działać na urządzeniu spełniającym następujące kryteria:
- Urządzenie musi mieć możliwość wyświetlania adresu URL o długości 40 znaków i kodu użytkownika o długości 15 znaków wraz z instrukcjami dla użytkownika.
- Urządzenie musi być połączone z internetem.
Pobieranie identyfikatora i tajnego klucza klienta
Aby wysyłać żądania do punktów końcowych logowania Google, aplikacja musi mieć identyfikator klienta OAuth 2.0 i tajny klucz klienta.
Aby znaleźć identyfikator klienta i tajny klucz klienta projektu:
- Wybierz istniejące dane logowania OAuth 2.0 lub otwórz stronę Dane logowania.
- Utwórz dane logowania OAuth 2.0 projektu, klikając Utwórz dane logowania > Identyfikator klienta OAuth, i podaj informacje potrzebne do utworzenia danych logowania.
- W sekcji Identyfikatory klienta OAuth 2.0 odszukaj Identyfikator klienta. Aby uzyskać szczegółowe informacje, kliknij identyfikator klienta.
Jeśli tworzysz nowy identyfikator klienta, wybierz typ aplikacji TV i urządzenia z ograniczoną możliwością wpisywania.
Uzyskiwanie kodu użytkownika i adresu URL weryfikacji
Gdy użytkownik poprosi o zalogowanie się na konto Google, możesz uzyskać kod użytkownika i adres URL weryfikacji, wysyłając żądanie HTTP POST do punktu końcowego urządzenia OAuth 2.0, https://oauth2.googleapis.com/device/code
. W prośbie podaj identyfikator klienta i listę wymaganych zakresów uprawnień. Jeśli chcesz tylko logować użytkowników na ich kontach Google, poproś o zakresy profile
i email
. Jeśli chcesz poprosić o dostęp do obsługiwanego interfejsu API w imieniu użytkowników, poproś o wymagane zakresy oprócz zakresów profile
i email
.
Oto przykład żądania kodu użytkownika:
POST /device/code HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded
client_id=YOUR_GOOGLE_CLIENT_ID&scope=email%20profile
Używasz curl
:
curl -d "client_id=YOUR_GOOGLE_CLIENT_ID&scope=email profile" https://oauth2.googleapis.com/device/code
Odpowiedź jest zwracana jako obiekt JSON:
{
"device_code" : "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8",
"user_code" : "GQVQ-JKEC",
"verification_url" : "https://www.google.com/device",
"expires_in" : 1800,
"interval" : 5
}
Aplikacja wyświetla użytkownikowi wartości user_code
i verification_url
, a zarazem co określony czas interval
wysyła zapytanie do punktu logowania, aż użytkownik się zaloguje lub upłynie czas określony przez parametr expires_in
.
Wyświetlanie kodu użytkownika i adresu URL weryfikacji
Gdy otrzymasz z punktu końcowego urządzenia kod użytkownika i adres URL do weryfikacji, wyświetl je i poinstruuj użytkownika, aby otworzył adres URL i wpisał kod użytkownika.
Wartości verification_url
i user_code
mogą ulec zmianie. Zaprojektuj interfejs w sposób, który pozwoli obsłużyć te ograniczenia:
user_code
musi być wyświetlany w polu o szerokości wystarczającej do wyświetlenia 15 znaków o rozmiarzeW
.- Wartość
verification_url
musi być wyświetlana w polu wystarczająco szerokim, aby obsłużyć ciąg adresu URL o długości 40 znaków.
Oba ciągi znaków mogą zawierać dowolne drukowalne znaki z zestawu znaków US-ASCII.
Wyświetlając ciąg user_code
, nie modyfikuj go w żaden sposób (np. nie zmieniaj wielkości liter ani nie wstawiaj innych znaków formatowania), ponieważ jeśli format kodu ulegnie zmianie, aplikacja może przestać działać.
Możesz zmodyfikować ciąg verification_url
, usuwając z adresu URL schemat, jeśli chcesz, aby adres URL był wyświetlany w innej formie. Jeśli tak, upewnij się, że aplikacja obsługuje zarówno wersję „http”, jak i „https”. Nie zmieniaj w żaden inny sposób ciągu tekstowego verification_url
.
Gdy użytkownik otworzy adres URL weryfikacji, zobaczy stronę podobną do tej:
Gdy użytkownik poda kod użytkownika, strona logowania Google wyświetli ekran zgody podobny do tego:
Jeśli użytkownik kliknie Zezwól, Twoja aplikacja może uzyskać token identyfikacyjny, aby zidentyfikować użytkownika, token dostępu do wywoływania interfejsów API Google oraz token odświeżania, aby pobrać nowe tokeny.
Pobieranie tokena identyfikacyjnego i tokena odświeżania
Gdy aplikacja wyświetli kod użytkownika i adres URL weryfikacji, rozpocznij odpytywanie punktu końcowego tokenu (https://oauth2.googleapis.com/token
) za pomocą kodu urządzenia, który otrzymałeś z punktu końcowego urządzenia. Odpytuj punkt końcowy tokena w okresie (w sekundach) określonym przez wartość interval
.
Oto przykładowe żądanie:
POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded
client_id=YOUR_GOOGLE_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&code=DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0
Używasz curl
:
curl -d "client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&code=YOUR_DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0" https://oauth2.googleapis.com/token
Jeśli użytkownik nie zatwierdził jeszcze prośby, odpowiedź będzie wyglądać tak:
{
"error" : "authorization_pending"
}
Aplikacja powinna powtarzać te żądania z częstotliwością nieprzekraczającą wartości interval
. Jeśli aplikacja wysyła zapytania zbyt szybko, odpowiedź będzie wyglądać tak:
{
"error" : "slow_down"
}
Gdy użytkownik się zaloguje i przyzna aplikacji dostęp do żądanych zakresów, odpowiedź na następne żądanie aplikacji będzie zawierać token identyfikatora, token dostępu i token odświeżania:
{
"access_token": "ya29.AHES6ZSuY8f6WFLswSv0HZLP2J4cCvFSj-8GiZM0Pr6cgXU",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "1/551G1yXUqgkDGnkfFk6ZbjMMMDIMxo3JFc8lY8CAR-Q",
"id_token": "eyJhbGciOiJSUzI..."
}
Po otrzymaniu tej odpowiedzi aplikacja może zdekodować token ID, aby uzyskać podstawowe informacje o profilu zalogowanego użytkownika, lub wysłać token ID do serwera backendowego aplikacji w celu bezpiecznej uwierzytelnienia na serwerze. Aplikacja może też używać tokena dostępu do wywołania interfejsów Google API, które użytkownik zatwierdził.
Tokeny identyfikatora i dostępu mają ograniczony czas ważności. Aby użytkownik pozostał zalogowany dłużej niż czas ważności tokenów, przechowuj token odświeżania i używaj go do wysyłania nowych tokenów.
Pobieranie informacji o profilu użytkownika z tokena identyfikatora
Aby uzyskać informacje o profilu zalogowanego użytkownika, możesz odkodować token identyfikacyjny za pomocą dowolnej biblioteki do dekodowania JWT. Na przykład za pomocą biblioteki JavaScript Auth0 jwt-decode:
var user_profile = jwt_decode(<var>id_token</var>);
// The "sub" field is available on all ID tokens. This value is unique for each
// Google account and can be used to identify the user. (But do not send this
// value to your server; instead, send the whole ID token so its authenticity
// can be verified.)
var user_id = user_profile["sub"];
// These values are available when you request the "profile" and "email" scopes.
var user_email = user_profile["email"];
var email_verified = user_profile["email_verified"];
var user_name = user_profile["name"];
var user_photo_url = user_profile["picture"];
var user_given_name = user_profile["given_name"];
var user_family_name = user_profile["family_name"];
var user_locale = user_profile["locale"];
Więcej informacji
- Aby użytkownicy pozostawali zalogowani dłużej niż przez czas ważności tokena tożsamości, zapoznaj się z artykułem Odświeżanie tokena dostępu.
- Jeśli musisz uwierzytelnić się na serwerze zaplecza, informacje o bezpiecznym uwierzytelnieniu znajdziesz w artykule Uwierzytelnianie na serwerze zaplecza.