Wdrażanie serwera OAuth 2.0

Każda integracja Cloud-to-cloud musi zawierać mechanizm uwierzytelniania użytkowników.

Uwierzytelnianie umożliwia połączenie kont Google użytkowników z kontami użytkowników w Twoim systemie uwierzytelniania. Dzięki temu możesz identyfikować użytkowników, gdy usługa realizacji otrzyma intencję dotyczącą inteligentnego domu. Inteligentny dom Google obsługuje tylko OAuth z przepływem kodu autoryzacji.

Na tej stronie opisujemy, jak skonfigurować serwer OAuth 2.0, aby działał z integracją Cloud-to-cloud.

Łączenie z kontem Google przez protokół OAuth

In the authorization code flow, you need two endpoints:

  • The authorization endpoint, which presents the sign-in UI to your users that aren't already signed in. The authorization endpoint also creates a short-lived authorization code to record users' consent to the requested access.

  • The token exchange endpoint, which is responsible for two types of exchanges:

    1. Exchanges an authorization code for a long-lived refresh token and a short-lived access token. This exchange happens when the user goes through the account linking flow.
    2. Exchanges a long-lived refresh token for a short-lived access token. This exchange happens when Google needs a new access token because the one it had expired.

Design guidelines

This section describes the design requirements and recommendations for the user screen that you host for OAuth linking flows. After it's called by Google's app, your platform displays a sign in to Google page and account linking consent screen to the user. The user is directed back to Google's app after giving their consent to link accounts.

This figure shows the steps for a user to link their Google account
            to your authentication system. The first screenshot shows
            user-initiated linking from your platform. The second image shows
            user sign-in to Google, while the third shows the user consent and
            confirmation for linking their Google account with your app. The
            final screenshot shows a successfully linked user account in the
            Google app.
Figure 1. Account linking user sign in to Google and consent screens.

Requirements

  1. You must communicate that the user’s account will be linked to Google, not a specific Google product like Google Home or Google Assistant.
  2. You must have a Google authorization statement such as "By signing in, you are authorizing Google to control your devices." See the Google Device Control Authorization section of the Google Home Developer Policies.
  3. You must open the Web OAuth linking page and ensure users have a clear method for signing in to their Google Account, such as fields for their username and password. Don't use the Google Sign-In (GSI) method that enables users to link without being taken to the Web OAuth Linking page. It is a violation of Google policy.
  4. You must include at least one of the following items in the OAuth linking page to indicate the integration to which the user is linking:
    • Company logo
    • Company name
    • Integration name
    • App icon

Recommendations

We recommend that you do the following:

  1. Display Google's Privacy Policy. Include a link to Google’s Privacy Policy on the consent screen.

  2. Data to be shared. Use clear and concise language to tell the user what data of theirs Google requires and why, and what usage or interaction data may be shared with you by Google.

  3. Clear call-to-action. State a clear call-to-action on your consent screen, such as “Agree and link.” This is because users need to understand what data they're required to share with Google to link their accounts.

  4. Ability to cancel. Provide a way for users to go back or cancel, if they choose not to link.

  5. Clear sign-in process. Ensure that users have a clear method for signing in to their Google Account, such as fields for their username and password or Sign in with Google.

  6. Ability to unlink. Offer a mechanism for users to unlink, such as a URL to their account settings on your platform. Alternatively, you can include a link to Google Account where users can manage their linked account. If a user unlinks from your integration, use agentUsers.delete to notify Google of the change.

  7. Ability to change user account. Suggest a method for users to switch their account(s). This is especially beneficial if users tend to have multiple accounts.

    • If a user must close the consent screen to switch accounts, send a recoverable error to Google so the user can sign in to the desired account with OAuth linking.
  8. Include your logo. Display your company logo on the consent screen. Use your style guidelines to place your logo. If you wish to also display Google's logo, see Logos and trademarks.

Przepływ kodu autoryzacji

Implementacja serwera OAuth 2.0 w przypadku przepływu kodu autoryzacji składa się z 2 punktów końcowych, które 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 interfejs logowania użytkownikom, którzy nie są jeszcze zalogowani, 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 uzyskiwania dostępu do 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, aby uzyskać od użytkowników pozwolenie na wywoływanie tych interfejsów API w ich imieniu.

Sesja przepływu kodu autoryzacji OAuth 2.0 zainicjowana przez Google przebiega w ten sposób:

  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. Usługa tworzy kod autoryzacji i zwraca go do Google. Aby to zrobić, przekieruj przeglądarkę użytkownika z powrotem do Google z kodem autoryzacji dołączonym do żądania.
  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 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.
  5. Po zakończeniu przez użytkownika procesu łączenia kont każde kolejne żądanie wysyłane z Google zawiera 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 zakresu oddzielonych spacjami, 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 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 końcowy autoryzacji obsługiwał żądania logowania, wykonaj te czynności:

  1. Sprawdź, czy client_id odpowiada identyfikatorowi klienta przypisanemu przez Ciebie do Google, a redirect_uri odpowiada adresowi URL przekierowania podanemu przez Google dla Twojej usługi. Te kontrole są ważne, aby zapobiec przyznawaniu dostępu nieprawidłowym lub nieprawidłowo skonfigurowanym aplikacjom klienckim. Jeśli obsługujesz wiele przepływów OAuth 2.0, sprawdź też, czy wartość parametru response_type to code.
  2. Sprawdź, czy użytkownik jest zalogowany w Twojej usłudze. Jeśli użytkownik nie jest zalogowany, wykonaj czynności konieczne, aby zalogować się w usłudze lub zarejestrować się w niej.
  3. 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.
  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. Przekierowuje przeglądarkę użytkownika na adres URL określony przez parametr redirect_uri. Podczas przekierowywania dołącz wygenerowany kod autoryzacji i oryginalną, niezmodyfikowaną wartość stanu, dodając parametry codestate. 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 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 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 dane logowania klienta znajdowały się w nagłówku żądania, musisz odpowiednio skonfigurować Cloud-to-cloud integrację:

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 (Chmura do chmury) kliknij Develop (Twórz).

  3. Kliknij Otwórz obok integracji.

  4. Przewiń w dół do sekcji Uprawnienia (opcjonalne) i zaznacz pole wyboru Przekazywanie przez Google identyfikatora klienta i tajnego klucza w nagłówku uwierzytelniania podstawowego HTTP.

  5. Kliknij Zapisz, aby zapisać zmiany.

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

Gdy użytkownik zaloguje się, a Twój punkt końcowy autoryzacji zwróci do Google ważny przez krótki czas kod autoryzacji, Google wyśle żądanie do Twojego punktu końcowego wymiany tokenów, aby wymienić kod 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 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 źródło i czy client_secret odpowiada oczekiwanej wartości.
  2. Sprawdź, czy kod autoryzacji jest ważny 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 potwierdzić 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. Tokeny mogą mieć dowolną wartość ciągu znaków, ale muszą jednoznacznie reprezentować użytkownika i klienta, dla którego są przeznaczone, oraz nie mogą być łatwe do odgadnięcia. W przypadku tokenów dostępu zapisz też czas wygaśnięcia tokena, który zwykle przypada godzinę po jego wydaniu. 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 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 wyśle żądanie do punktu końcowego wymiany tokenów, aby wymienić token odświeżania na nowy token dostępu.

W przypadku tych żądań wartość parametru grant_type to refresh_token, a wartość parametru refresh_token to wartość tokena odświeżania, który został wcześniej przyznany 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:

  1. Sprawdź, czy client_id wskazuje, że żądanie pochodzi z Google, i czy client_secret ma oczekiwaną wartość.
  2. Sprawdź, czy token odświeżania jest prawidłowy i czy identyfikator klienta podany w żądaniu jest zgodny z identyfikatorem klienta powiązanym z tokenem odświeżania.
  3. Jeśli nie możesz potwierdzić wszystkich powyższych kryteriów, zwróć błąd HTTP 400 Bad Request z {"error": "invalid_grant"} w treści.
  4. W przeciwnym razie użyj identyfikatora użytkownika z tokena odświeżania, aby wygenerować token dostępu. Tokeny mogą mieć dowolną wartość ciągu znaków, ale muszą jednoznacznie reprezentować użytkownika i klienta, dla których są przeznaczone, oraz nie mogą być zgadywalne. W przypadku tokenów dostępu zapisz też czas wygaśnięcia tokena, zwykle godzinę po jego wydaniu.
  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.