Logowanie się na telewizorach i urządzeniach objętych ograniczeniami

Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą kont Google na urządzeniach z ograniczonymi możliwościami wpisywania danych, np. na telewizorach 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, wpisuje kod i zezwala aplikacji na dostęp do danych logowania użytkownika. Na koniec aplikacja otrzymuje potwierdzenie, a użytkownik jest zalogowany.

Aby można było korzystać z tej procedury, aplikacja musi działać na urządzeniu, który spełnia te kryteria:

  • Urządzenie musi obsługiwać 40-znakowy URL, 15-znakowy kod użytkownika i instrukcje.
  • Urządzenie musi mieć połączenie z internetem.

Pobieranie identyfikatora klienta i tajnego klucza klienta

Twoja aplikacja wymaga identyfikatora klienta OAuth 2.0 i tajnego klucza klienta do wysyłania żądań do punktów końcowych logowania Google&.

Aby znaleźć identyfikator klienta i tajny klucz klienta, wykonaj te czynności:

  1. Wybierz istniejące dane logowania OAuth 2.0 lub otwórz stronę Dane logowania.
  2. Jeśli nie zostało to jeszcze zrobione, utwórz dane uwierzytelniające OAuth 2.0 w swoim projekcie, klikając Utwórz dane logowania & identyfikator klienta OAuth, i podaj informacje potrzebne do utworzenia danych logowania.
  3. W sekcji Identyfikatory klienta OAuth 2.0 znajdź identyfikator klienta. Aby uzyskać szczegółowe informacje, kliknij identyfikator klienta.

Jeśli tworzysz nowy identyfikator klienta, wybierz typ aplikacji Telewizory i urządzenia z ograniczonym dostępem.

Uzyskiwanie kodu użytkownika i adresu URL do weryfikacji

Gdy użytkownik chce zalogować się przy użyciu konta Google, uzyskujesz kod użytkownika i adres URL do weryfikacji, wysyłając żądanie HTTP POST do punktu końcowego urządzenia OAuth 2.0 (https://oauth2.googleapis.com/device/code). Dołącz swój identyfikator klienta i listę zakresów potrzebnych w żądaniu. Jeśli chcesz logować się tylko na kontach Google, poproś tylko o zakresy profile i email, a jeśli chcesz poprosić o uprawnienia do wywoływania obsługiwanych interfejsów API w imieniu użytkowników, poproś o wymagane zakresy oprócz zakresów profile i email.

Oto przykładowe żądanie kodu użytkownika:

POST /device/code HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=CLIENT_ID&scope=email%20profile

Na urządzeniu curl:

curl -d "client_id=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 jednocześnie sonduje punkt końcowy logowania w określonym interval, dopóki użytkownik nie zaloguje się lub nie upłynie czasu określonego przez expires_in.

Wyświetl kod użytkownika i URL do weryfikacji

Gdy otrzymasz kod użytkownika i adres URL do weryfikacji z punktu końcowego urządzenia, wyświetl go i poproś użytkownika o otwarcie adresu URL i wpisanie kodu użytkownika.

Wartości verification_url i user_code mogą ulec zmianie. Zaprojektuj interfejs w taki sposób, by spełniał te limity:

  • Wartość user_code musi być wyświetlana w polu wystarczająco szerokim, by obsłużyć 15 znaków o rozmiarze W.
  • Tag verification_url musi być wyświetlany w polu o szerokości do 40 znaków.

Oba ciągi mogą zawierać dowolny znak do wydrukowania z zestawu znaków US-ASCII.

Wyświetlając ciąg znaków user_code, nie należy w żaden sposób go modyfikować (np. zmieniać wielkości liter ani wstawiać innych znaków formatowania), ponieważ w przyszłości format kodu może ulec awarii.

Jeśli chcesz zmienić ciąg znaków verification_url, usuń go z adresu URL na potrzeby wyświetlania. Jeśli tak, dopilnuj, aby aplikacja obsługiwała zarówno warianty „&”, jak i „https"https”. W inny sposób nie modyfikuj ciągu znaków verification_url.

Gdy użytkownik przejdzie pod ten adres, zobaczy stronę podobną do tej:

Podłącz urządzenie, wpisując kod

Po wpisaniu kodu przez użytkownika strona logowania Google wyświetla ekran zgody podobny do tego:

Przykładowy ekran zgody dla klienta urządzenia

Jeśli użytkownik kliknie Zezwól, aplikacja będzie mogła uzyskać token identyfikatora, aby zidentyfikować użytkownika, token dostępu do wywoływania interfejsów API Google oraz token odświeżania, aby pobrać nowe tokeny.

Uzyskiwanie tokena tożsamości i odświeżanie tokena

Gdy aplikacja wyświetli kod użytkownika i URL do weryfikacji, zacznij odpytywać punkt końcowy tokena (https://oauth2.googleapis.com/token) kodem urządzenia otrzymanym z punktu końcowego urządzenia. Czas trwania punktu końcowego tokena w przedziale czasu (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=CLIENT_ID&client_secret=CLIENT_SECRET&code=DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0

Na urządzeniu curl:

curl -d "client_id=CLIENT_ID&client_secret=CLIENT_SECRET&code=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:

{
  "error" : "authorization_pending"
}

Aplikacja powinna powtarzać te żądania z częstotliwością, która nie przekracza wartości interval. Jeśli aplikacja zbyt szybko wykonuje ankiety, odpowiedź będzie taka:

{
  "error" : "slow_down"
}

Gdy użytkownik się zaloguje i przyzna aplikacji dostęp do żądanych zakresów, odpowiedź na kolejne żądanie aplikacji będzie zawierać token identyfikatora, token dostępu oraz 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 Twoja aplikacja może dekodować token identyfikatora, aby uzyskać podstawowe informacje o profilu zalogowanego użytkownika, lub wysłać token identyfikatora do serwera backendu aplikacji, aby bezpiecznie przeprowadzić uwierzytelnianie na serwerze. Oprócz tego Twoja aplikacja może używać tokena dostępu, aby wywoływać interfejsy API Google, które autoryzował użytkownik.

Tokeny tożsamości i dostępu mają ograniczony czas trwania. Aby użytkownik był zalogowany dłużej niż po zakończeniu działania tokenów, zapisz token odświeżania i użyj go do wysłania prośby o nowe tokeny.

Pobieranie informacji z profilu użytkownika z tokena identyfikatora

Aby uzyskać informacje o zalogowanym użytkowniku, zdekoduj identyfikator w dowolnej bibliotece JWT. Na przykład w bibliotece JavaScript jwt-decode Auth0:

var user_profile = jwt_decode(id_token);

// 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