Logowanie się na telewizorach i niektórych urządzeniach wejściowych

Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą kont Google na urządzeniach z ograniczonymi możliwościami wprowadzania danych, takich jak telewizory połączone z internetem.

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 przyznaje aplikacji uprawnienia dostępu do danych logowania. Na koniec aplikacja otrzymuje potwierdzenie, a użytkownik jest zalogowany.

Aby można było korzystać z tego procesu logowania, aplikacja musi działać na urządzeniu spełniającym te kryteria:

  • Urządzenie musi być w stanie wyświetlać 40-znakowy adres URL i 15-znakowy kod użytkownika wraz z instrukcjami dla użytkownika.
  • Urządzenie musi być połączone z internetem.

Pobieranie identyfikatora i tajnego klucza klienta

Aby aplikacja mogła wysyłać żądania do punktów końcowych logowania Google, potrzebuje identyfikatora klienta i tajnego klucza klienta OAuth 2.0.

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

  1. Wybierz istniejące dane logowania OAuth 2.0 lub otwórz stronę Dane logowania.
  2. Utwórz dane logowania OAuth 2.0 projektu, klikając Utwórz dane logowania > Identyfikator klienta OAuth, a następnie podaj informacje potrzebne do utworzenia danych logowania.
  3. Znajdź Identyfikator klienta w sekcji Identyfikatory klienta OAuth 2.0. 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 weryfikacyjnego adresu URL

Gdy użytkownik poprosi o zalogowanie się przy użyciu konta Google, otrzymasz kod użytkownika i URL do weryfikacji, wysyłając żądanie POST HTTP 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, które są potrzebne w żądaniu. Jeśli chcesz logować użytkowników tylko za pomocą kont Google, poproś o zakresy profile i email. Jeśli chcesz poprosić o uprawnienia do wywoływania obsługiwanego interfejsu API w imieniu użytkowników, poproś o zakresy wymagane poza zakresami 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=YOUR_GOOGLE_CLIENT_ID&scope=email%20profile

Użycie pakietu 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 i jednocześnie sonduje punkt końcowy logowania w określonym miejscu interval, dopóki użytkownik się nie zaloguje lub nie minie czas określony w zasadzie expires_in.

Wyświetlaj kod użytkownika i URL do weryfikacji

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

Wartości verification_url i user_code mogą ulec zmianie. Zaprojektuj interfejs tak, by obsługiwał te ograniczenia:

  • user_code musi być wyświetlany w polu o szerokości wystarczająco szerokiej, aby pomieścić 15 znaków o rozmiarze W.
  • Wartość verification_url musi być wyświetlana w polu o szerokości wystarczająco szerokiej, aby umożliwić obsługę ciągu 40 znaków.

Oba ciągi mogą zawierać dowolny możliwy do wydrukowania znak ze zestawu znaków US-ASCII.

Gdy wyświetlasz 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ż w przypadku zmiany formatu kodu w przyszłości aplikacja może przestać działać.

Ciąg verification_url możesz zmodyfikować, usuwając schemat z adresu URL do celów wyświetlania. Jeśli tak, upewnij się, że aplikacja obsługuje zarówno warianty „http”, jak i „https”. Nie zmieniaj w inny sposób ciągu znaków verification_url.

Gdy użytkownik otworzy adres URL do weryfikacji, zobaczy stronę podobną do tej:

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

Gdy użytkownik wpisze kod użytkownika, witryna logowania Google wyświetli 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 umożliwiający identyfikację użytkownika, token dostępu do wywoływania interfejsów API Google oraz token odświeżania w celu uzyskania nowych tokenów.

Uzyskaj token tożsamości i token odświeżania

Gdy aplikacja wyświetli kod użytkownika i adres URL do weryfikacji, rozpocznij odpytywanie punktu końcowego tokena (https://oauth2.googleapis.com/token) przy użyciu kodu urządzenia otrzymanego z tego punktu końcowego. Odpytuj punkt końcowy tokena w odstępach czasu (w sekundach) określonych za pomocą wartości 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życie pakietu 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 zaakceptował jeszcze prośby, odpowiedź jest następująca:

{
  "error" : "authorization_pending"
}

Aplikacja powinna powtarzać te żądania z częstotliwością nieprzekraczającą wartości interval. Jeśli aplikacja będzie przeprowadzać ankiety zbyt szybko, odpowiedź jest 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 obejmowała 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 identyfikatora, aby uzyskać podstawowe informacje profilowe zalogowanego użytkownika, lub wysłać token identyfikatora na serwer backendu aplikacji, aby bezpiecznie uwierzytelnić się na serwerze. Aplikacja może też używać tokena dostępu do wywołania interfejsów API Google, które autoryzował użytkownik.

Tokeny tożsamości i dostępu mają ograniczony czas ważności. Aby użytkownik pozostawał zalogowany po zakończeniu okresu ważności tokenów, zapisz token odświeżania i użyj go do żądania nowych tokenów.

Pobierz informacje o profilu użytkownika z tokena tożsamości

Informacje o profilu zalogowanego użytkownika możesz uzyskać, zdekodując token identyfikatora za pomocą dowolnej biblioteki dekodowania JWT. Na przykład w bibliotece 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