Overview

Every smart home Action must include a mechanism for authenticating users.

Authentication allows you to link your users' Google accounts with user accounts in your authentication system. This allows you to identify your users when your fulfillment receives a smart home intent. Google smart home only supports OAuth with an authorization code flow.

Рекомендации по дизайну

В этом разделе описаны требования к дизайну и рекомендации для экрана согласия на привязку учетной записи App Flip. После того, как Google вызывает ваше приложение, ваше приложение отображает экран согласия для пользователя.

Требования

  1. Вы должны сообщить, что учетная запись пользователя связана с Google, а не с конкретным продуктом Google, таким как Google Home или Google Assistant.

Рекомендации

Мы рекомендуем вам сделать следующее:

  1. Показать Политику конфиденциальности Google. Включите ссылку на Политику конфиденциальности Google на экране согласия.

  2. Данные для обмена. Используйте ясный и лаконичный язык, чтобы сообщить пользователю, какие данные ему нужны Google и почему.

  3. Четкий призыв к действию. Укажите четкий призыв к действию на экране вашего согласия, например «Примите и установите ссылку». Это связано с тем, что пользователям необходимо понимать, какими данными они должны поделиться с Google, чтобы связать свои учетные записи.

  4. Возможность отмены. Предоставьте пользователям возможность вернуться или отменить, если они решат не переходить по ссылке.

  5. Возможность разорвать связь. Предложите пользователям механизм отмены связи, например URL-адрес настроек их учетных записей на вашей платформе. Кроме того, вы можете добавить ссылку на учетную запись Google, где пользователи могут управлять своей связанной учетной записью.

  6. Возможность смены учетной записи пользователя. Предложите пользователям способ переключения своих учетных записей. Это особенно полезно, если у пользователей, как правило, несколько учетных записей.

    • Если пользователю необходимо закрыть экран согласия для переключения учетных записей, отправьте в Google исправляемую ошибку, чтобы пользователь мог войти в желаемую учетную запись с привязкой OAuth и неявным потоком.
  7. Включите свой логотип. Отобразите логотип вашей компании на экране согласия. Используйте свои рекомендации по стилю, чтобы разместить свой логотип. Если вы хотите также отображать логотип Google, см. Логотипы и товарные знаки .

На этом рисунке показан пример экрана согласия с указанием индивидуальных требований и рекомендаций, которым необходимо следовать при разработке экрана согласия пользователя.
Рисунок 2. Рекомендации по созданию экрана согласия для связывания учетной записи.

Implement OAuth account linking

To implement OAuth account linking in your smart home Action, you must do the following:

  1. Implement your OAuth 2.0 server.
  2. Configure account linking in the Actions console.

Implement your OAuth 2.0 server

This section describes how to set up your OAuth 2.0 server so that it works with your smart home Action.

Реализация потока кода авторизации на сервере OAuth 2.0 состоит из двух конечных точек, которые ваша служба делает доступными по протоколу HTTPS. Первая конечная точка - это конечная точка авторизации, которая отвечает за поиск или получение согласия пользователей на доступ к данным. Конечная точка авторизации представляет пользовательский интерфейс для входа вашим пользователям, которые еще не вошли в систему, и записывает согласие на запрошенный доступ. Вторая конечная точка - это конечная точка обмена токенами, которая используется для получения зашифрованных строк, называемых токенами, которые разрешают пользователю доступ к вашей службе.

Когда приложению Google необходимо вызвать один из API вашей службы, Google использует эти конечные точки вместе, чтобы получить разрешение от ваших пользователей на вызов этих API от их имени.

Сеанс потока кода авторизации OAuth 2.0, инициированный Google, имеет следующий поток:

  1. Google открывает вашу конечную точку авторизации в браузере пользователя. Если поток для действия запускается на голосовом устройстве, Google передает выполнение на телефон.
  2. Пользователь входит в систему, если еще не вошел, и предоставляет Google разрешение на доступ к своим данным с помощью вашего API, если он еще не предоставил разрешение.
  3. Ваш сервис создает код авторизации и возвращает его в Google. Для этого перенаправьте браузер пользователя обратно в Google с кодом авторизации, прикрепленным к запросу.
  4. Google отправляет код авторизации в вашу конечную точку обмена токенами, которая проверяет подлинность кода и возвращает токен доступа и токен обновления . Токен доступа - это недолговечный токен, который ваша служба принимает в качестве учетных данных для доступа к API. Токен обновления - это токен с долгим сроком службы, который Google может хранить и использовать для получения новых токенов доступа по истечении срока их действия.
  5. После того, как пользователь завершил процесс связывания учетной записи, каждый последующий запрос, отправленный от Google, содержит токен доступа.

Обработка запросов на авторизацию

Когда вам нужно выполнить привязку учетной записи с использованием потока кода авторизации OAuth 2.0, Google отправляет пользователя в конечную точку авторизации с запросом, который включает следующие параметры:

Параметры конечной точки авторизации
client_id Идентификатор клиента Google, который вы зарегистрировали в Google.
redirect_uri URL-адрес, на который вы отправляете ответ на этот запрос.
state Бухгалтерская стоимость, которая возвращается в Google без изменений в URI перенаправления.
scope Необязательно: разделенный пробелами набор строк области видимости, в которых указываются данные, для которых Google запрашивает авторизацию.
response_type Тип значения, возвращаемого в ответе. Для потока кода авторизации OAuth 2.0 типом ответа всегда является code .
user_locale Настройка языка учетной записи Google в формате RFC5646 , используемая для локализации вашего контента на предпочтительный язык пользователя.

Например, если ваша конечная точка авторизации доступна по адресу https://myservice.example.com/auth , запрос может выглядеть следующим образом:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code&user_locale=LOCALE

Чтобы конечная точка авторизации могла обрабатывать запросы на вход, выполните следующие действия:

  1. Убедитесь, что client_id соответствует идентификатору клиента Google, который вы зарегистрировали в Google, и что redirect_uri соответствует URL-адресу перенаправления, предоставленному Google для вашей службы. Эти проверки важны для предотвращения предоставления доступа непреднамеренным или неправильно настроенным клиентским приложениям. Если вы поддерживаете несколько потоков OAuth 2.0, также убедитесь, что response_type - это code .
  2. Проверьте, вошел ли пользователь в вашу службу. Если пользователь не вошел в систему, завершите процесс входа или регистрации в вашей службе.
  3. Сгенерируйте код авторизации, который Google будет использовать для доступа к вашему API. Код авторизации может быть любым строковым значением, но он должен однозначно представлять пользователя, клиента, для которого предназначен токен, и срок действия кода, и его нельзя угадывать. Обычно вы выдаете коды авторизации, срок действия которых истекает примерно через 10 минут.
  4. Убедитесь, что URL-адрес, указанный в параметре redirect_uri имеет следующий вид:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
      
  5. Перенаправьте браузер пользователя на URL-адрес, указанный в параметре redirect_uri . Включите только что сгенерированный код авторизации и исходное неизмененное значение состояния при перенаправлении, добавив параметры code и state . Ниже приведен пример полученного URL:
    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING

Обработка запросов на обмен токенами

Конечная точка обмена токенами вашей службы отвечает за два типа обмена токенами:

  • Обмен кодами авторизации на токены доступа и токены обновления
  • Обменять токены обновления на токены доступа

Запросы на обмен токенами включают следующие параметры:

Параметры конечной точки обмена токенами
client_id Строка, определяющая источник запроса как Google. Эта строка должна быть зарегистрирована в вашей системе как уникальный идентификатор Google.
client_secret Секретная строка, которую вы зарегистрировали в Google для своей службы.
grant_type Тип обмениваемого токена. Это либо authorization_code либо refresh_token .
code Когда grant_type=authorization_code , этот параметр представляет собой код, полученный Google от конечной точки входа или обмена токенами.
redirect_uri Когда grant_type=authorization_code , этот параметр является URL-адресом, используемым в первоначальном запросе авторизации.
refresh_token Когда grant_type=refresh_token , этот параметр представляет собой токен обновления, полученный Google от вашей конечной точки обмена токенами.
Обмен кодами авторизации на токены доступа и токены обновления

После того, как пользователь входит в систему и ваша конечная точка авторизации возвращает краткосрочный код авторизации в Google, Google отправляет запрос вашей конечной точке обмена токенами для обмена кодом авторизации на токен доступа и токен обновления.

Для этих запросов значение grant_type - authorization_code , а значение code - значение кода авторизации, который вы ранее предоставили Google. Ниже приведен пример запроса на обмен кода авторизации на токен доступа и токен обновления:

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

Для обмена кодами авторизации для токена доступа и токена обновления ваша конечная точка обмена токенами отвечает на запросы POST , выполняя следующие шаги:

  1. Убедитесь, что client_id определяет источник запроса как авторизованный источник, и что client_secret соответствует ожидаемому значению.
  2. Убедитесь, что код авторизации действителен и не истек, и что идентификатор клиента, указанный в запросе, совпадает с идентификатором клиента, связанным с кодом авторизации.
  3. Убедитесь, что URL-адрес, указанный в параметре redirect_uri идентичен значению, используемому в первоначальном запросе авторизации.
  4. Если вы не можете проверить все вышеперечисленные критерии, верните ошибку HTTP 400 Bad Request с {"error": "invalid_grant"} в качестве тела.
  5. В противном случае используйте идентификатор пользователя из кода авторизации для создания токена обновления и токена доступа. Эти токены могут иметь любое строковое значение, но они должны однозначно представлять пользователя и клиента, для которого предназначен токен, и их нельзя угадывать. Для токенов доступа также запишите время истечения срока действия токена, которое обычно составляет час после выдачи токена. Срок действия токенов обновления не истекает.
  6. Вернуть следующий объект JSON в теле ответа HTTPS:
    {
    "token_type": "Bearer",
    "access_token": "ACCESS_TOKEN",
    "refresh_token": "REFRESH_TOKEN",
    "expires_in": SECONDS_TO_EXPIRATION
    }
    

Google хранит токен доступа и токен обновления для пользователя и записывает истечение срока действия токена доступа. Когда срок действия токена доступа истекает, Google использует токен обновления, чтобы получить новый токен доступа от вашей конечной точки обмена токенами.

Обменять токены обновления на токены доступа

Когда срок действия токена доступа истекает, Google отправляет запрос в вашу конечную точку обмена токенами, чтобы обменять токен обновления на новый токен доступа.

Для этих запросов значение grant_type равно refresh_token , а значение refresh_token - это значение токена обновления, который вы ранее предоставили Google. Ниже приведен пример запроса на обмен токена обновления на токен доступа:

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

Чтобы обменять токен обновления на токен доступа, ваша конечная точка обмена токенами отвечает на запросы POST , выполняя следующие шаги:

  1. Убедитесь, что client_id определяет источник запроса как Google, и что client_secret соответствует ожидаемому значению.
  2. Убедитесь, что токен обновления действителен и что идентификатор клиента, указанный в запросе, совпадает с идентификатором клиента, связанным с токеном обновления.
  3. Если вы не можете проверить все вышеперечисленные критерии, верните ошибку HTTP 400 Bad Request с {"error": "invalid_grant"} в качестве тела.
  4. В противном случае используйте идентификатор пользователя из токена обновления для создания токена доступа. Эти токены могут иметь любое строковое значение, но они должны однозначно представлять пользователя и клиента, для которого предназначен токен, и их нельзя угадывать. Для токенов доступа также записывайте время истечения срока действия токена, обычно через час после выдачи токена.
  5. Верните следующий объект JSON в теле ответа HTTPS:
    {
    "token_type": "Bearer",
    "access_token": " ACCESS_TOKEN ",
    "expires_in": SECONDS_TO_EXPIRATION
    }

Configure account linking in the console

To set up account linking in the Actions console, follow these steps:

  1. Go to the Actions console.
  2. Select your smart home Action project.
  3. Click the Develop tab. Then, click Account linking in the left navigation.
  4. Fill out all the fields under OAuth Client information. Click Next.
  5. Click Save.

Next steps (optional)

Once you have an OAuth 2.0 implementation, you can optionally configure OAuth-based App Flip, which allows your users to more quickly link their accounts in your authentication system to their Google accounts. For App Flip implementation instructions, see OAuth-based App Flip.