Процесс связывания аккаунтов и получения токенов
Связывание аккаунтов — это процесс сопряжения аккаунта Сбер ID пользователя с его аккаунтом в вашей системе. В результате умный дом Sber получает:
- access-токен, с которым может отправлять команды в ваше облако,
 - refresh-токен, необходимый для обновления access-токена.
 
Чтобы связывание аккаунтов работало корректно, нужно реализовать вебхук для запроса информации о пользователе (get user). Убедитесь, что вебхук реализован, до того, как тестировать сервис авторизации.
Получение access- и refresh-токенов
Получение токенов происходит по стандартному протоколу OAuth 2.0 с помощью кода авторизации (Authorization Code Grant):

Шаг 1. Выбор вендора
В приложении Салют пользователь открывает экран  
 → Сервисы → Подключить умный дом от других производителей. Затем на вкладке Подключить выбирает нужного вендора — вас.
Шаг 2. Вызов формы авторизации вендора
Умный дом Sber обращается к вашему авторизационному серверу для получения формы авторизации:
GET https://example.com/authorize
    ?response_type=code
    &client_id=example_id
    &redirect_uri=https://example_callback_uri
    &scope=example_scope
    &state=example_state
| Параметр | Обязательный? | Описание | 
| https://example.com/authorize | ✔︎ | Адрес вашего авторизационного сервера (Authorization Endpoint) — его вы указываете в Studio | 
| response_type | ✔︎ | Запрашиваемый умным домом тип авторизации. Используется значение code — оно указывает, что запрашивается авторизация по коду | 
| client_id | ✔︎ | Идентификатор клиента — приложения, запрашивающего доступ. Идентификатор вы указываете в Studio | 
| redirect_uri | ✔︎ | Адрес, на который авторизационный сервер будет перенаправлять пользователя после авторизации. Допустимые URI возврата: 
  | 
| scope | Поля аккаунта пользователя в вашей базе, к которым будет разрешен доступ для умного дома Sber. Эти поля вы указываете в Studio. Если в Studio   | |
| state | Уникальный статус авторизации, используется для предотвращения CSRF-атак. Авторизационный сервер должен возвращать этот параметр без изменения значения | 
Пример запроса:
curl -i -X GET /oauth/login HTTP/1.1 \
--header Host: auth.yourserver.ru \
--header Content-Type: application/x-www-form-urlencoded \
--data-urlencode client_id=IId-DIWEnd1234h2buia \
--data-urlencode redirect_uri=https://gateway.iot.sberdevices.ru/gateway/v1/binder/backward \
--data-urlencode state=xy1234
Шаг 3. Форма авторизации вендора
В приложении Салют отображается ваша форма авторизации.
Шаг 4. Логин и пароль
Пользователь вводит в форму логин и пароль от своей учетной записи в вашей системе.
Шаг 5. Проверка логина и пароля
Ваш авторизационный сервер проверяет введенные логин и пароль пользователя.
Шаг 6. Код авторизации
Если логин и пароль верны, авторизационный сервер делает редирект на URI возврата. При этом параметр state возвращается без изменений, а в параметре code сервер возвращает код авторизации.
HTTP/1.1 302 Found
Location: https://example_callback_uri
          ?code=example_code
          &state=example_state
| Параметр | Обязательный? | Описание | 
| https://example_callback_uri | ✔︎ | Адрес перенаправления. Указывается в запросе авторизации (см. шаг 2) | 
| code | ✔︎ | Код авторизации | 
| state | ✔︎ | Уникальный статус авторизации, используется для предотвращения CSRF-атак. Если state был в запросе, он должен возвращаться без изменений | 
При возникновении любых ошибок, кроме отсутствующего либо поврежденного redirect_uri или client_id, должен выполняться редирект на URI возврата. При этом в параметры адреса должно быть добавлено название ошибки, также должен быть возвращен параметр state. Дополнительно в парамерах могут быть переданы детальное описание ошибки и ссылка на страницу в интернете.
Location: https://example_callback_uri
    &error=example_error
    &error_description=example_description
    &error_uri=example_uri
    &state=example_state
| Параметр | Обязательный? | Описание | 
| https://example_callback_uri | ✔︎ | Адрес перенаправления. Указывается в запросе авторизации (см. шаг 2) | 
| error | ✔︎ | Название ошибки. Названия см. в спецификации OAuth 2.0 | 
| error_description | Детальное описание ошибки | |
| error_uri | Адрес веб-страницы с дополнительным описанием ошибки | |
| state | ✔︎ | Уникальный статус авторизации, используется для предотвращения CSRF-атак. Если state был в запросе, он должен возвращаться без изменений | 
Если в запросе отсутствует или имеет неверный формат параметр redirect_uri или параметр client_id, нужно отобразить сообщение пользователю. Редирект выполнять не нужно.
Пример успешного ответа:
HTTP/1.1 302 Found
Location: https://gateway.iot.sberdevices.ru/gateway/v1/binder/backward
    ?code=1234567890abcdef1234567890abcdef12345678
    &state=xy1234
Пример ответа с ошибкой. В примере идентификатор приложения client_id имеет верный формат, но он не добавлен в список разрешенных на авторизационном сервере:
HTTP/1.1 302 Found
Location: https://gateway.iot.sberdevices.ru/gateway/v1/binder/backward
    ?error=unauthorized_client
    &state=xy1234
Шаг 7. Запрос токенов
Умный дом использует полученный код, а также ваши Client ID и Secret ID и отправляет запрос на получение access-токена и refresh-токена пользователя:
POST /token HTTP/1.1
    Host: https://example.com/token
    Content-Type: application/x-www-form-urlencoded
    client_id=example_id
    &client_secret=example_secret
    &grant_type=authorization_code
    &code=example_code
    &redirect_uri=example_callback_uri
| Параметр | Обязательный? | Описание | 
| https://example.com/token | ✔︎ | Адрес для получения токена, который вы указали в Studio. Этот же адрес будет использоваться для обновления токенов пользователя | 
| client_id | ✔︎ | Идентификатор клиента — приложения, запрашивающего доступ. Идентификатор вы указываете в Studio | 
| client_secret | ✔︎ | Секрет клиента — ключ для проверки подлинности приложения. Его вы указываете в Studio | 
| grant_type | ✔︎ | Тип доступа. Принимает значение authorization_code | 
| code | ✔︎ | Код авторизации, полученный на шаге 6 | 
| redirect_uri | ✔︎ | Адрес, на который авторизационный сервер будет перенаправлять пользователя после авторизации. Идентичен   | 
Пример запроса:
curl -i -X POST /oauth/token HTTP/1.1 \
--header Host: auth.yourserver.ru \
--header Content-Type: application/x-www-form-urlencoded \
--data-urlencode client_id=IId-DIWEnd1234h2buia \
--data-urlencode client_secret=diwoNKJE-Owd312jdwJ \
--data-urlencode grant_type=authorization_code \
--data-urlencode code=1234567890abcdef1234567890abcdef12345678 \
--data-urlencode redirect_uri=https://gateway.iot.sberdevices.ru/gateway/v1/binder/backward
Шаг 8. Проверка Authorization Code, Client ID, Secret ID
Ваш авторизационный сервер проверяет предоставленные умным домом данные: код авторизации, идентификатор клиента и секрет клиента.
Шаг 9. Access-токен и refresh-токен пользователя
Ваш авторизационный сервер возвращает access-токен и refresh-токен пользователя. Умный дом сохраняет их и в дальнейшем использует при отправке запросов к вашему облаку.
{
    "access_token": string,
    "refresh_token": string,
    "expires_in": integer,
    "token_type": string
}
| Параметр | Обязательный? | Описание | 
| access_token | ✔︎ | Токен доступа | 
| refresh_token | ✔ | Токен, использующийся для обновления access_token. Время жизни refresh_token должно быть значительно больше времени жизни access_token и составлять не менее 1 часа. Рекомендуемое значение времени жизни refresh_token —  в пять раз больше времени жизни access_token | 
| expires_in | Время, через которое  Если параметр не задан, время действия токена считается не ограниченным  | |
| token_type | ✔︎ | Тип токена. Используется тип Bearer: для использования токена достаточно его самого и не требуется дополнительного подтверждения прав | 
Если выдать токены не удалось, ответ должен содержать название ошибки. Дополнительно могут быть переданы детальное описание ошибки и ссылка на страницу в интернете.
{
    "error": string,
    "error_description": string,
    "error_uri": string
}