Każda integracja Cloud-to-cloud musi zawierać mechanizm uwierzytelniania użytkowników.
Uwierzytelnianie umożliwia powiązanie kont Google użytkowników z kontami użytkowników w systemie uwierzytelniania. Dzięki temu możesz identyfikować użytkowników, gdy usługa realizacji otrzyma intencję dotyczącą inteligentnego domu. Google Home obsługuje tylko OAuth z procesem kodu autoryzacji.
Na tej stronie opisujemy, jak skonfigurować serwer OAuth 2.0, aby współpracował z integracją Cloud-to-cloud.
Łączenie kont Google przez OAuth
W przypadku przepływu kodu autoryzacji potrzebujesz 2 punktów końcowych:
Punkt końcowy autoryzacji, który wyświetla interfejs logowania użytkownikom, którzy nie są jeszcze zalogowani. Punkt autoryzacji tworzy też krótkotrwały kod autoryzacji, aby zarejestrować zgodę użytkowników na żądany dostęp.
Punkt końcowy wymiany tokenów, który odpowiada za 2 rodzaje wymian:
- Wymienia kod autoryzacji na długoterminowy token odświeżania i krótkoterminowy token dostępu. Wymiana następuje, gdy użytkownik przechodzi proces łączenia kont.
- Wymienia długotrwały token odświeżania na krótkotrwały token dostępu. Ta wymiana następuje, gdy Google potrzebuje nowego tokena dostępu, ponieważ poprzedni wygasł.
Wskazówki dotyczące wyglądu
W tej sekcji opisujemy wymagania i zalecenia dotyczące projektu ekranu użytkownika, który hostujesz w przypadku przepływów łączenia OAuth. Gdy aplikacja Google wywoła tę funkcję, platforma wyświetli użytkownikowi stronę logowania w Google i ekran zgody na połączenie kont. Po wyrażeniu zgody na połączenie kont użytkownik wraca do aplikacji Google.
Wymagania
- Musisz poinformować użytkownika, że jego konto zostanie połączone z Google, a nie z konkretną usługą Google, taką jak Google Home czy Asystent Google.
- Musisz mieć oświadczenie o autoryzacji Google, np. „Logując się, zezwalasz Google na sterowanie Twoimi urządzeniami”. Zapoznaj się z sekcją Autoryzacja sterowania urządzeniami Google w zasadach dla deweloperów Google Home.
- Musisz otworzyć stronę łączenia OAuth w internecie i zapewnić użytkownikom przejrzystą metodę logowania się na konto Google, np. pola na nazwę użytkownika i hasło. Nie używaj metody logowania przez Google (GSI), która umożliwia użytkownikom łączenie kont bez przekierowywania ich na stronę łączenia kont za pomocą protokołu OAuth w internecie. Stanowi to naruszenie zasad Google.
- Na stronie łączenia OAuth musisz umieścić co najmniej 1 z tych elementów, aby wskazać integrację, z którą użytkownik łączy swoje konto:
- Logo firmy
- Nazwa firmy
- Nazwa integracji
- Ikona aplikacji
Rekomendacje
Zalecamy wykonanie tych czynności:
Wyświetl Politykę prywatności Google. Na ekranie zgody umieść link do Polityki prywatności Google.
Dane, które mają być udostępniane. Używaj jasnego i zwięzłego języka, aby poinformować użytkownika, jakich danych wymaga Google i dlaczego.
Jednoznaczne wezwanie do działania Na ekranie zgody umieść jasne wezwanie do działania, np. „Zgadzam się i łączę”. Użytkownicy muszą wiedzieć, jakie dane muszą udostępnić Google, aby połączyć swoje konta.
Możliwość anulowania. Zapewnij użytkownikom możliwość powrotu lub anulowania, jeśli nie chcą połączyć kont.
Prosty proces logowania. Upewnij się, że użytkownicy mają jasną metodę logowania się na konto Google, np. pola na nazwę użytkownika i hasło lub przycisk Zaloguj się przez Google.
Możliwość odłączenia Udostępniać użytkownikom mechanizm odłączania, np. adres URL do ustawień konta na Twojej platformie. Możesz też dodać link do konta Google, na którym użytkownicy mogą zarządzać połączonym kontem.
Możliwość zmiany konta użytkownika. Zaproponuj użytkownikom metodę przełączania kont. Jest to szczególnie korzystne, jeśli użytkownicy mają zwykle kilka kont.
- Jeśli użytkownik musi zamknąć ekran akceptacji, aby przełączyć konta, wyślij do Google błąd, który można naprawić, aby użytkownik mógł zalogować się na wybrane konto za pomocą połączenia OAuth.
Dodaj logo. Wyświetlanie logo firmy na ekranie zgody. Umieść logo zgodnie z wytycznymi dotyczącymi stylu. Jeśli chcesz też wyświetlać logo Google, zapoznaj się z sekcją Loga i znaki towarowe.
Przepływ kodu autoryzacji
Implementacja serwera OAuth 2.0 przepływu kodu autoryzacji składa się z 2 punktów końcowych, które usługa udostępnia przez HTTPS. Pierwszym punktem końcowym jest punkt autoryzacji, który odpowiada za znalezienie lub uzyskanie zgody użytkowników na dostęp do danych. Punkt końcowy autoryzacji wyświetla interfejs logowania użytkownikom, którzy nie są jeszcze zalogowani, i rejestruje zgodę na żądany dostęp. Drugim punktem końcowym jest punkt wymiany tokenów, który służy do uzyskiwania zaszyfrowanych ciągów znaków, zwanych tokenami, które upoważniają użytkownika do dostępu do usługi.
Gdy aplikacja Google musi wywołać jeden z interfejsów API Twojej usługi, używa tych punktów końcowych, aby uzyskać od użytkowników uprawnienia do wywoływania tych interfejsów API w ich imieniu.
Sesja przepływu kodu autoryzacji OAuth 2.0 zainicjowana przez Google ma następujący przebieg:
- Google otwiera punkt końcowy autoryzacji w przeglądarce użytkownika. Jeśli przepływ został uruchomiony na urządzeniu obsługującym wyłącznie polecenia głosowe w ramach akcji, Google przenosi wykonanie na telefon.
- Użytkownik loguje się, jeśli jeszcze tego nie zrobił, i udziela Google pozwolenia na dostęp do swoich danych za pomocą interfejsu API, jeśli wcześniej tego nie zrobił.
- Usługa tworzy kod autoryzacji i zwraca go do Google. W tym celu przekieruj przeglądarkę użytkownika z powrotem do Google, dołączając do żądania kod autoryzacji.
- Google wysyła kod autoryzacji do punktu końcowego wymiany tokenów, który weryfikuje autentyczność kodu i zwraca token dostępu oraz token odświeżania. Token dostępu to krótkoterminowy token, który Twoja usługa akceptuje jako dane logowania umożliwiające dostęp do interfejsów API. Token odświeżania to token o długim okresie ważności, który Google może przechowywać i używać do uzyskiwania nowych tokenów dostępu po wygaśnięciu poprzednich.
- Gdy użytkownik ukończy proces łączenia kont, każde kolejne żądanie wysyłane przez Google będzie zawierało token dostępu.
Obsługa próśb o autoryzację
Gdy musisz przeprowadzić łączenie kont za pomocą przepływu kodu autoryzacji OAuth 2.0, Google wysyła użytkownika do Twojego punktu końcowego autoryzacji z żądaniem zawierającym te parametry:
| Parametry punktu końcowego autoryzacji | |
|---|---|
client_id |
Identyfikator klienta przypisany przez Ciebie do Google. |
redirect_uri |
Adres URL, na który wysyłasz odpowiedź na to żądanie. |
state |
Wartość księgowa, która jest przekazywana z powrotem do Google bez zmian w identyfikatorze URI przekierowania. |
scope |
Opcjonalnie: zestaw ciągów tekstowych zakresu oddzielonych spacjami, które określają dane, do których Google prosi o autoryzację. |
response_type |
Typ wartości zwracanej w odpowiedzi. W przypadku przepływu kodu autoryzacji OAuth 2.0 typ odpowiedzi to zawsze code.
|
Jeśli na przykład Twój punkt końcowy autoryzacji jest dostępny pod adresem https://myservice.example.com/auth, żądanie może wyglądać tak:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code
Aby punkt autoryzacji obsługiwał żądania logowania, wykonaj te czynności:
- Sprawdź, czy
client_idodpowiada identyfikatorowi klienta przypisanemu przez Ciebie do Google, aredirect_uri– adresowi URL przekierowania podanemu przez Google dla Twojej usługi. Tego typu kontrole są ważne, ponieważ zapobiegają udzielaniu dostępu niezamierzonym lub błędnie skonfigurowanym aplikacjom klienckim. Jeśli obsługujesz wiele przepływów OAuth 2.0, sprawdź także, czyresponse_typetocode. - Sprawdź, czy użytkownik jest zalogowany w Twojej usłudze. Jeśli użytkownik nie jest zalogowany, wykonaj czynności konieczne, aby się zalogować lub zarejestrować w usłudze.
- Wygeneruj kod autoryzacji, którego Google będzie używać do uzyskiwania dostępu do Twojego interfejsu API. Kod autoryzacji może być dowolnym ciągiem znaków, ale musi jednoznacznie reprezentować użytkownika, klienta, dla którego przeznaczony jest token, i czas wygaśnięcia kodu, a także nie może być łatwy do odgadnięcia. Zazwyczaj wydajesz kody autoryzacji, które wygasają po około 10 minutach.
- Sprawdź, czy adres URL określony przez parametr
redirect_urima następującą postać:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
- przekierować przeglądarkę użytkownika na adres URL określony przez parametr
redirect_uri. Podczas przekierowywania dołącz wygenerowany kod autoryzacji i oryginalną, niezmienioną wartość stanu, dodając parametrycodeistate. Oto przykład powstałego adresu URL:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING
Obsługa żądań wymiany tokenów
Punkt końcowy wymiany tokenów Twojej usługi odpowiada za dwa rodzaje wymiany tokenów:
- Wymiana kodów autoryzacyjnych na tokeny dostępu i odświeżanie tokenów
- Wymiana tokenów odświeżania na tokeny dostępu
Żądania wymiany tokenów zawierają te parametry:
| Parametry punktu końcowego wymiany tokenów | |
|---|---|
client_id |
Ciąg znaków, który identyfikuje źródło żądania jako Google. Ten ciąg znaków musi być zarejestrowany w Twoim systemie jako unikalny identyfikator Google. |
client_secret |
Tajny ciąg znaków zarejestrowany w Google w przypadku Twojej usługi. |
grant_type |
Rodzaj wymienianego tokena. Może to być authorization_code lub refresh_token. |
code |
Gdy wartość tego parametru to grant_type=authorization_code, jest to kod otrzymany przez Google z punktu końcowego logowania lub wymiany tokenów. |
redirect_uri |
Gdy grant_type=authorization_code, ten parametr jest adresem URL używanym w początkowym żądaniu autoryzacji. |
refresh_token |
Gdy grant_type=refresh_token, ten parametr jest tokenem odświeżania otrzymanym przez Google z punktu końcowego wymiany tokenów. |
Konfigurowanie sposobu wysyłania przez Google danych logowania na Twój serwer
W zależności od implementacji serwer autoryzacji oczekuje otrzymania danych logowania klienta w treści żądania lub w nagłówku żądania.
Domyślnie Google wysyła dane logowania w treści żądania. Jeśli serwer autoryzacji wymaga, aby w nagłówku żądania znajdowały się dane uwierzytelniające klienta, należy odpowiednio skonfigurować integrację Cloud-to-cloud:
Na liście projektów kliknij Otwórz obok projektu, nad którym chcesz pracować.
W obszarze Cloud-to-Cloud wybierz opcję Rozwijaj.
Kliknij Otwórz obok integracji.
Przewiń w dół do sekcji Uprawnienia (opcjonalne) i zaznacz pole wyboru Pozwól Google przesyłać identyfikator klienta i tajny klucz za pomocą nagłówka podstawowego uwierzytelniania HTTP.
Kliknij Zapisz, aby zapisać zmiany.
Wymiana kodów autoryzacji na tokeny dostępu i tokeny odświeżania
Po zalogowaniu się użytkownika i zwróceniu przez punkt końcowy autoryzacji krótkotrwałego kodu autoryzacji do Google, Google wysyła żądanie do punktu końcowego wymiany tokenów w celu wymiany kodu autoryzacji na token dostępu i token odświeżania.
W przypadku tych żądań wartość parametru grant_type to authorization_code, a wartość parametru code to wartość kodu autoryzacji, który został wcześniej przyznany Google. Oto przykład żądania wymiany kodu autoryzacji na token dostępu i token odświeżania:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI
Aby wymienić kody autoryzacyjne na token dostępu i token odświeżania, punkt końcowy wymiany tokenów odpowiada na żądania POST, wykonując następujące kroki:
- Sprawdź, czy
client_ididentyfikuje źródło żądania jako źródło autoryzowane i czyclient_secretodpowiada oczekiwanej wartości. - Sprawdź, czy kod autoryzacyjny jest ważny i nie wygasł, a także czy identyfikator klienta podany w żądaniu jest zgodny z identyfikatorem klienta powiązanym z kodem autoryzacyjnym.
- Sprawdź, czy adres URL określony przez parametr
redirect_urijest identyczny z wartością używaną w początkowym żądaniu autoryzacji. - Jeśli nie możesz sprawdzić wszystkich powyższych kryteriów, zwróć błąd HTTP 400 Bad Request z
{"error": "invalid_grant"}jako treścią. - W przeciwnym wypadku należy użyć identyfikatora użytkownika z kodu autoryzacyjnego w celu wygenerowania tokena odświeżania i tokena dostępu. Tokeny te mogą być dowolnym ciągiem znaków, ale muszą jednoznacznie reprezentować użytkownika i klienta, dla którego przeznaczony jest token, i nie mogą być odgadywalne. W przypadku tokenów dostępu zanotuj także czas wygaśnięcia tokena, który zazwyczaj przypada na godzinę po jego wydaniu. Tokeny odświeżania nie wygasają.
- Zwróć następujący obiekt JSON w treści odpowiedzi HTTPS:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Google przechowuje token dostępu i token odświeżania dla użytkownika oraz rejestruje datę wygaśnięcia tokena dostępu. Gdy token dostępu wygaśnie, Google użyje tokena odświeżania, aby uzyskać nowy token dostępu z punktu końcowego wymiany tokenów.
Wymiana tokenów odświeżania na tokeny dostępu
Gdy token dostępu wygaśnie, Google wysyła żądanie do punktu końcowego wymiany tokenów w celu wymiany tokena odświeżania na nowy token dostępu.
W przypadku tych żądań wartość grant_type wynosi refresh_token, a wartość refresh_token jest wartością tokena odświeżania, który wcześniej przyznałeś firmie Google. Oto przykład żądania wymiany tokena odświeżania na token dostępu:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
Aby wymienić token odświeżania na token dostępu, punkt końcowy wymiany tokenów
odpowiada na żądania POST, wykonując te czynności:
- Sprawdź, czy
client_ididentyfikuje źródło żądania jako Google i czyclient_secretodpowiada oczekiwanej wartości. - Sprawdź, czy token odświeżania jest prawidłowy i czy identyfikator klienta określony w żądaniu jest zgodny z identyfikatorem klienta skojarzonym z tokenem odświeżania.
- Jeśli nie możesz sprawdzić wszystkich powyższych kryteriów, zwróć błąd HTTP 400 Bad Request z
{"error": "invalid_grant"}jako treścią. - W przeciwnym wypadku należy użyć identyfikatora użytkownika z tokena odświeżania w celu wygenerowania tokena dostępu. Tokeny te mogą być dowolnym ciągiem znaków, ale muszą jednoznacznie reprezentować użytkownika i klienta, dla którego przeznaczony jest token, i nie mogą być odgadywalne. W przypadku tokenów dostępu zapisz także czas wygaśnięcia tokena, zwykle godzinę po jego wydaniu.
- Zwróć następujący obiekt JSON w treści odpowiedzi HTTPS:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Obsługa żądań informacji o użytkowniku
Punkt końcowy informacji o użytkowniku jest chronionym przez OAuth 2.0 zasobem, który zwraca deklaracje dotyczące połączonego użytkownika. Wdrożenie i hosting punktu końcowego informacji o użytkowniku jest opcjonalne. Wyjątkiem są te przypadki użycia:
- Logowanie się na połączone konto za pomocą Google One Tap
- Bezproblemowa subskrypcja na AndroidTV.
Po pobraniu tokena dostępu z punktu końcowego tokena Google wysyła żądanie do punktu końcowego informacji o użytkowniku, aby pobrać podstawowe informacje profilowe połączonego użytkownika.
| nagłówki żądań punktu końcowego informacji o użytkowniku | |
|---|---|
Authorization header |
Token dostępu typu okaziciela. |
Jeśli na przykład punkt końcowy informacji o użytkowniku jest dostępny pod adresem
https://myservice.example.com/userinfo, żądanie może wyglądać tak:
GET /userinfo HTTP/1.1 Host: myservice.example.com Authorization: Bearer ACCESS_TOKEN
Aby punkt końcowy informacji o użytkowniku mógł obsługiwać żądania, wykonaj te czynności:
- Wyodrębnij token dostępu z nagłówka autoryzacji i zwróć informacje o użytkowniku powiązanym z tym tokenem.
- Jeśli token dostępu jest nieprawidłowy, zwróć błąd HTTP 401 (Brak autoryzacji) i użyj nagłówka odpowiedzi
WWW-Authenticate. Poniżej znajduje się przykładowa odpowiedź na pytanie o błąd w informacjach o użytkowniku: Jeśli podczas procesu łączenia pojawi się błąd 401 (Brak autoryzacji) lub inna nieudana próba połączenia, błędu nie będzie można odzyskać, pobrany token zostanie odrzucony, a użytkownik będzie musiał ponownie zainicjować proces łączenia.HTTP/1.1 401 Unauthorized WWW-Authenticate: error="invalid_token", error_description="The Access Token expired"
Jeśli token dostępu jest prawidłowy, zwróć odpowiedź HTTP 200 z podanym niżej obiektem JSON w treści HTTPS odpowiedź:
Jeśli punkt końcowy informacji o użytkowniku zwraca odpowiedź HTTP 200, pobrany token i żądania są rejestrowane dla konta Google użytkownika.{ "sub": "USER_UUID", "email": "EMAIL_ADDRESS", "given_name": "FIRST_NAME", "family_name": "LAST_NAME", "name": "FULL_NAME", "picture": "PROFILE_PICTURE", }odpowiedź dotycząca punktu końcowego informacji o użytkowniku subUnikalny identyfikator, który identyfikuje użytkownika w Twoim systemie. emailAdres e-mail użytkownika. given_nameOpcjonalnie: imię użytkownika. family_nameOpcjonalnie: nazwisko użytkownika. nameOpcjonalnie: pełna nazwa użytkownika. pictureOpcjonalnie: zdjęcie profilowe użytkownika.