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

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:

  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, i podaj informacje potrzebne do utworzenia danych logowania.
  3. 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 profileemail. 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 profileemail.

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_codeverification_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 rozmiarze W.
  • 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:

Łączenie urządzenia przez wpisanie kodu

Gdy użytkownik poda kod użytkownika, strona logowania Google wyświetli ekran zgody podobny do tego:

Przykład ekranu zgody dla klienta na urządzeniu

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