Logowanie przez Google na telewizory i urządzenia

Możesz pozwolić użytkownikom na logowanie się do aplikacji przy użyciu kont Google na urządzeniach z ograniczonymi możliwościami wprowadzania danych, takich jak telewizory podłączone do internetu.

Aplikacja wyświetla krótki kod i adres URL logowania do użytkownika. Następnie użytkownik otwiera adres URL logowania w przeglądarce internetowej, wprowadza kod i udziela aplikacji uprawnienia dostępu do informacji logowania użytkownika. Na koniec aplikacja otrzymuje potwierdzenie, a użytkownik jest zalogowany.

Aby korzystać z tego przepływu logowania, aplikacja musi działać na urządzeniu, które spełnia następujące kryteria:

  • Urządzenie musi mieć możliwość wyświetlania 40-znakowego adresu URL i 15-znakowego kodu użytkownika wraz z instrukcjami dla użytkownika.
  • Urządzenie musi być połączone z Internetem.

Uzyskaj identyfikator klienta i klucz tajny

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

Aby znaleźć identyfikator klienta i klucz tajny projektu, wykonaj następujące czynności:

  1. Wybierz istniejące poświadczenie OAuth 2.0 lub otwórz stronę Poświadczenia .
  2. Jeśli jeszcze tego nie zrobiłeś, utwórz poświadczenia OAuth 2.0 swojego projektu, klikając Utwórz dane logowania> Identyfikator klienta OAuth i podając informacje potrzebne do utworzenia poświadczeń.
  3. Szukać ID Klienta w dziale IDs OAuth 2.0 klienta. Aby uzyskać szczegółowe informacje, kliknij identyfikator klienta.

Jeśli tworzysz nowy identyfikator klienta, wybierz typ aplikacji Telewizory i urządzenia z ograniczonym wejściem .

Uzyskaj kod użytkownika i weryfikacyjny adres URL

Gdy użytkownik zażąda zalogowania się przy użyciu konta Google, otrzymasz kod użytkownika i weryfikacyjny adres URL, 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, których potrzebujesz, wraz z żądaniem. Jeśli chcesz logować użytkowników tylko za pomocą ich kont Google, poproś tylko o profile i zakresy email - email ; lub, jeśli chcesz poprosić o pozwolenie na wywołanie obsługiwanego interfejsu API w imieniu użytkowników, poproś o wymagane zakresy oprócz zakresów profile i email - email .

Poniżej znajduje się 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

Korzystanie z 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
}

Twoja aplikacja wyświetla user_code i verification_url wartości dla użytkownika, a jednocześnie, odpytuje sign-in punktu końcowego w określonym interval aż albo znaki użytkowników lub w terminie określonym przez expires_in minęło.

Wyświetl kod użytkownika i weryfikacyjny adres URL

Po otrzymaniu kodu użytkownika i weryfikacyjnego adresu URL z punktu końcowego urządzenia wyświetl je i poinstruuj użytkownika, aby otworzył adres URL i wprowadził kod użytkownika.

Wartości verification_url i user_code mogą ulec zmianie. Zaprojektuj swój interfejs użytkownika w sposób, który poradzi sobie z następującymi ograniczeniami:

  • user_code musi być wyświetlany w polu o szerokości wystarczającej do obsłużenia 15 znaków o rozmiarze W
  • 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 łańcuchy mogą zawierać dowolny drukowalny znak z zestawu znaków US-ASCII.

Podczas wyświetlania ciągu user_code nie modyfikuj go w żaden sposób (na przykład zmieniając wielkość liter lub wstawiając inne znaki formatujące), ponieważ Twoja aplikacja może się zepsuć, jeśli format kodu zmieni się w przyszłości.

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

Gdy użytkownik przejdzie pod weryfikacyjny adres URL, zobaczy stronę podobną do poniższej:

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

Po wpisaniu przez użytkownika kodu użytkownika witryna logowania Google wyświetla ekran akceptacji podobny do poniższego:

Przykładowy ekran akceptacji dla klienta urządzenia

Jeśli użytkownik kliknie Zezwól , Twoja aplikacja może uzyskać token identyfikatora w celu zidentyfikowania 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 identyfikacyjny i odśwież token

Gdy aplikacja wyświetli kod użytkownika i weryfikacyjny adres URL, rozpocznij odpytywanie punktu końcowego tokenu ( https://oauth2.googleapis.com/token ) za pomocą kodu urządzenia otrzymanego z punktu końcowego urządzenia. Sonduj punkt końcowy tokenu w odstępie 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

Korzystanie z 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 żądania, odpowiedź jest następująca:

{
  "error" : "authorization_pending"
}

Twoja aplikacja powinna powtarzać te żądania z częstotliwością nieprzekraczającą wartości interval . Jeśli Twoja aplikacja sonduje zbyt szybko, odpowiedź jest następująca:

{
  "error" : "slow_down"
}

Gdy użytkownik zaloguje się i przyzna aplikacji dostęp do żądanych zakresów, odpowiedź na kolejne żądanie aplikacji 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 identyfikatora, aby uzyskać podstawowe informacje o profilu o zalogowanym użytkowniku lub wysłać token identyfikatora do serwera zaplecza aplikacji, aby bezpiecznie uwierzytelnić się na serwerze. Ponadto Twoja aplikacja może używać tokenu dostępu do wywoływania interfejsów API Google, które autoryzował użytkownik.

Identyfikatory i tokeny dostępu mają ograniczony czas życia. Aby użytkownik był zalogowany poza okresami istnienia tokenów, zapisz token odświeżania i użyj go do żądania nowych tokenów .

Uzyskaj informacje o profilu użytkownika z tokena identyfikatora

Informacje o profilu zalogowanego użytkownika można uzyskać, dekodując znacznik identyfikatora za pomocą dowolnej biblioteki dekodującej JWT . Na przykład przy użyciu biblioteki JavaScript Auth0 jwt-decode :

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