Wdrażanie serwera OAuth 2.0

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 realizująca zamówienia 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 końcowy autoryzacji tworzy też krótkotrwały kod autoryzacji, aby rejestrować zgodę użytkowników na żądany dostęp.

  • Punkt końcowy wymiany tokenów, który odpowiada za 2 rodzaje wymian:

    1. 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.
    2. 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 protokołu 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 zostaje przekierowany z powrotem do aplikacji Google.

Ilustracja przedstawiająca kroki, które użytkownik musi wykonać, aby połączyć swoje konto Google z Twoim systemem uwierzytelniania. Pierwszy zrzut ekranu pokazuje inicjowane przez użytkownika połączenie z Twojej platformy. Drugi obraz przedstawia logowanie użytkownika w Google, a trzeci – zgodę użytkownika i potwierdzenie połączenia konta Google z aplikacją. Ostatni zrzut ekranu pokazuje pomyślnie połączone konto użytkownika w aplikacji Google.
Rysunek 1. Ekrany logowania użytkownika na konto Google i ekrany zgody w procesie łączenia kont.

Wymagania

  1. Musisz poinformować użytkownika, że jego konto zostanie połączone z Google, a nie z konkretnym produktem Google, taką jak Google Home czy Asystent Google.
  2. Musisz mieć oświadczenie o autoryzacji Google, np. „Logując się, upoważniasz Google do sterowania Twoimi urządzeniami”. Zapoznaj się z sekcją Autoryzacja sterowania urządzeniami Google w Zasadach dla deweloperów Google Home.
  3. 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.
  4. Na stronie łączenia OAuth musisz umieścić co najmniej 1 z tych elementów, aby wskazać integrację, z którą użytkownik się łączy:
    • Logo firmy
    • Nazwa firmy
    • Nazwa integracji
    • Ikona aplikacji

Rekomendacje

Zalecamy wykonanie tych czynności:

  1. Wyświetl Politykę prywatności Google. Na ekranie zgody umieść link do Polityki prywatności Google.

  2. Dane, które mają być udostępniane. Używaj jasnego i zwięzłego języka, aby informować użytkowników, jakich danych wymaga Google i dlaczego, oraz jakie dane o użytkowaniu lub interakcjach mogą być udostępniane Ci przez Google.

  3. 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.

  4. Możliwość anulowania. Zapewnij użytkownikom możliwość powrotu lub anulowania, jeśli nie chcą połączyć kont.

  5. 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.

  6. Możliwość odłączenia Udostępnij 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. Jeśli użytkownik odłączy się od Twojej integracji, użyj metody agentUsers.delete, aby powiadomić Google o tej zmianie.

  7. 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 zgody, 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.
  8. Dodaj logo. wyświetlać logo firmy na ekranie zgody; Umieść logo zgodnie z wytycznymi dotyczącymi stylu. Jeśli chcesz wyświetlać logo Google, zapoznaj się z sekcją Loga i znaki towarowe.

Przepływ kodu autoryzacji

Implementacja serwera OAuth 2.0 z przepływem kodu autoryzacji składa się z 2 punktów końcowych, które Twoja usługa udostępnia przez HTTPS. Pierwszy punkt końcowy to punkt końcowy autoryzacji, który odpowiada za znajdowanie lub uzyskiwanie zgody użytkowników na dostęp do danych. Punkt końcowy autoryzacji wyświetla użytkownikom, którzy nie są jeszcze zalogowani, interfejs logowania i rejestruje zgodę na żądany dostęp. Drugi punkt końcowy to punkt końcowy wymiany tokenów, który służy do uzyskiwania zaszyfrowanych ciągów znaków, zwanych tokenami, które autoryzują użytkownika do korzystania z Twojej usługi.

Gdy aplikacja Google musi wywołać jeden z interfejsów API Twojej usługi, Google używa tych punktów końcowych razem, aby uzyskać od użytkowników zgodę na wywoływanie tych interfejsów API w ich imieniu.

Sesja przepływu kodu autoryzacji OAuth 2.0 zainicjowana przez Google ma następujący przebieg:

  1. Google otwiera punkt końcowy autoryzacji w przeglądarce użytkownika. Jeśli przepływ został rozpoczęty na urządzeniu obsługującym tylko głos w przypadku działania, Google przenosi wykonanie na telefon.
  2. Użytkownik loguje się (jeśli nie jest jeszcze zalogowany) i przyznaje Google uprawnienia dostępu do swoich danych za pomocą Twojego interfejsu API, jeśli nie zrobił tego wcześniej.
  3. Twoja usługa tworzy kod autoryzacji i zwraca go do Google. Aby to zrobić, przekieruj przeglądarkę użytkownika z powrotem do Google, dołączając do żądania kod autoryzacji.
  4. 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 token ważny przez krótki czas, który Twoja usługa akceptuje jako dane logowania do interfejsów API. Token odświeżania to token ważny przez długi czas, który Google może przechowywać i używać do uzyskiwania nowych tokenów dostępu, gdy te wygasną.
  5. Gdy użytkownik zakończy proces łączenia kont, każde kolejne żądanie wysyłane z Google będzie zawierać token dostępu.

Obsługa żądań autoryzacji

Gdy musisz połączyć konta za pomocą przepływu kodu autoryzacji OAuth 2.0, Google wysyła użytkownika do punktu końcowego autoryzacji z żądaniem, które zawiera 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: rozdzielony spacjami zbiór ciągów znaków zakresu, które określają dane, do których Google prosi o autoryzację.
response_type Typ wartości, która ma zostać zwrócona w odpowiedzi. W przypadku przepływu kodu autoryzacji OAuth 2.0 typ odpowiedzi jest zawsze code.

Jeśli na przykład 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 końcowy autoryzacji obsługiwał żądania logowania, wykonaj te czynności:

  1. Sprawdź, czy client_id jest zgodny z identyfikatorem klienta przypisanym przez Ciebie do Google, a redirect_uri jest zgodny z adresem URL przekierowania podanym przez Google dla Twojej usługi. Te sprawdzenia są ważne, aby zapobiec przyznaniu dostępu do niezamierzonych lub nieprawidłowo skonfigurowanych aplikacji klienckich. Jeśli obsługujesz wiele przepływów OAuth 2.0, sprawdź też, czy response_type ma wartość code.
  2. Sprawdź, czy użytkownik jest zalogowany w Twojej usłudze. Jeśli użytkownik nie jest zalogowany, wykonaj proces logowania lub rejestracji w swojej usłudze.
  3. Wygeneruj kod autoryzacji, którego Google może użyć do uzyskania 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 jest przeznaczony token, i czas wygaśnięcia kodu, a także nie może być łatwy do odgadnięcia. Zwykle wydajesz kody autoryzacji, które wygasają po około 10 minutach.
  4. Sprawdź, czy adres URL określony przez parametr redirect_uri ma następującą postać:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
      
  5. Przekieruj przeglądarkę użytkownika na adres URL określony przez redirect_uri parametr. Podczas przekierowania dołącz wygenerowany kod autoryzacji i oryginalną, niezmodyfikowaną wartość stanu, dodając parametry code i state. Oto przykład wynikowego 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 2 rodzaje wymiany tokenów:

  • Wymiana kodów autoryzacji na tokeny dostępu i tokeny odświeżania
  • 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 Typ wymienianego tokena. Może to być authorization_code lub refresh_token.
code Gdy grant_type=authorization_code, ten parametr jest kodem, który Google otrzymało z Twojego 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, który Google otrzymało z Twojego punktu końcowego wymiany tokenów.

Konfigurowanie sposobu wysyłania danych logowania przez Google 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 dane logowania klienta znajdowały się w nagłówku żądania, musisz odpowiednio skonfigurować integrację Cloud-to-cloud zgodnie z wymaganiami:

Otwórz Konsolę programisty.

  1. Na liście projektów kliknij Otwórz obok projektu, nad którym chcesz pracować.

  2. W sekcji Cloud-to-cloud kliknij Opracuj.

  3. Kliknij Otwórz obok integracji.

  4. Przewiń w dół do sekcji Uprawnienia (opcjonalnie) i zaznacz pole Google ma przesyłać identyfikator klienta i tajny klucz w nagłówku HTTP basic auth.

  5. Kliknij Zapisz , aby zapisać zmiany.

Wymiana kodów autoryzacji na tokeny dostępu i tokeny odświeżania

Gdy użytkownik się zaloguje, a punkt końcowy autoryzacji zwróci do Google ważny przez krótki czas kod autoryzacji, Google wysyła żądanie do punktu końcowego wymiany tokenów, aby wymienić kod autoryzacji na token dostępu i token odświeżania.

W przypadku tych żądań wartość grant_type to authorization_code, a wartość code to wartość kodu autoryzacji, którą wcześniej przyznałeś(-aś) 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 wymieniać kody autoryzacji na token dostępu i token odświeżania, punkt końcowy wymiany tokenów odpowiada na żądania POST, wykonując te czynności:

  1. Sprawdź, czy client_id identyfikuje źródło żądania jako autoryzowane, a client_secret jest zgodny z oczekiwaną wartością.
  2. Sprawdź, czy kod autoryzacji jest prawidłowy i nie wygasł oraz czy identyfikator klienta podany w żądaniu jest zgodny z identyfikatorem klienta powiązanym z kodem autoryzacji.
  3. Sprawdź, czy adres URL określony przez parametr redirect_uri jest identyczny z wartością używaną w początkowym żądaniu autoryzacji.
  4. Jeśli nie możesz zweryfikować wszystkich powyższych kryteriów, zwróć błąd HTTP 400 Bad Request z treścią {"error": "invalid_grant"}.
  5. W przeciwnym razie użyj identyfikatora użytkownika z kodu autoryzacji, aby wygenerować token odświeżania i token dostępu. Te tokeny mogą być dowolnym ciągiem znaków, ale muszą jednoznacznie reprezentować użytkownika i klienta, dla którego jest przeznaczony token, a także nie mogą być łatwe do odgadnięcia. W przypadku tokenów dostępu zapisz też czas wygaśnięcia tokena, który zwykle wynosi godzinę od momentu wydania tokena. Tokeny odświeżania nie wygasają.
  6. W treści odpowiedzi HTTPS zwróć ten obiekt JSON:
    {
    "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 użytkownika oraz rejestruje wygaśnięcie tokena dostępu. Gdy token dostępu wygaśnie, Google używa 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, aby wymienić token odświeżania na nowy token dostępu.

W przypadku tych żądań wartość grant_type to refresh_token, a wartość refresh_token to wartość tokena odświeżania, którą wcześniej przyznałeś(-aś) 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 wymieniać token odświeżania na token dostępu, punkt końcowy wymiany tokenów odpowiada na żądania POST, wykonując te czynności:

  1. Sprawdź, czy client_id identyfikuje źródło żądania jako Google, a client_secret jest zgodny z oczekiwaną wartością.
  2. Sprawdź, czy token odświeżania jest prawidłowy oraz czy identyfikator klienta podany w żądaniu jest zgodny z identyfikatorem klienta powiązanym z tokenem odświeżania.
  3. Jeśli nie możesz zweryfikować wszystkich powyższych kryteriów, zwróć błąd HTTP 400 Bad Request z treścią {"error": "invalid_grant"}.
  4. W przeciwnym razie użyj identyfikatora użytkownika z tokena odświeżania, aby wygenerować token dostępu. Te tokeny mogą być dowolnym ciągiem znaków, ale muszą jednoznacznie reprezentować użytkownika i klienta, dla którego jest przeznaczony token, a także nie mogą być łatwe do odgadnięcia. W przypadku tokenów dostępu zapisz też czas wygaśnięcia tokena, który zwykle wynosi godzinę od momentu wydania tokena.
  5. W treści odpowiedzi HTTPS zwróć ten obiekt JSON:
    {
    "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:

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:

  1. Wyodrębnij token dostępu z nagłówka autoryzacji i zwróć informacje o użytkowniku powiązanym z tym tokenem.
  2. 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:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    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.
  3. Jeśli token dostępu jest prawidłowy, zwróć odpowiedź HTTP 200 z podanym niżej obiektem JSON w treści HTTPS odpowiedź:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    Jeśli punkt końcowy informacji o użytkowniku zwraca odpowiedź HTTP 200, pobrany token i żądania są rejestrowane dla konta Google użytkownika.

    odpowiedź dotycząca punktu końcowego informacji o użytkowniku
    sub Unikalny identyfikator, który identyfikuje użytkownika w Twoim systemie.
    email Adres e-mail użytkownika.
    given_name Opcjonalnie: imię użytkownika.
    family_name Opcjonalnie: nazwisko użytkownika.
    name Opcjonalnie: pełna nazwa użytkownika.
    picture Opcjonalnie: zdjęcie profilowe użytkownika.