Дополнить навык

Проверить, возможна ли авторизация на поверхности пользователя

Если тело запроса содержит свойство account_linking — поверхность поддерживает авторизацию.

{
  "meta": {
    "client_id": "ru.yandex.example-id/1.1 (none none; android 4.4.2)",
    "interfaces": {
      "account_linking": {},
      "screen": {}
    },
    "locale": "ru-RU",
    "timezone": "UTC"
  },
  "request": {
    "command": "баланс",
    "nlu": {
      "entities": [],
      "tokens": [
        "баланс"
      ]
    },
    "original_utterance": "баланс",
    "type": "SimpleUtterance"
  },

  "session": {
    "message_id": 1,
    "session_id": "2eac4854-fce721f3-b845abba-20d60",
    "skill_id": "3ad36498-f5rd-4079-a14b-788652932056",
    "user_id": "47C73714B580ED2469056E71081159529FFC676A4E5B059D629A819E857DC2F8",
    "user": {
      "user_id": "6C91DA5198D1758C6A9F63A7C5CDDF09359F683B13A18A151FBF4C8B092BB0C2",
      "access_token": "AgAAAAAB4vpbAAApoR1oaCd5yR6eiXSHqOGT8dT"
    },
    "application": {
      "application_id": "47C73714B580ED2469056E71081159529FFC676A4E5B059D629A819E857DC2F8"
    }
  },
  "version": "1.0"
}

Если свойства account_linking нет, то навык не должен отвечать командой для ее запуска (start_account_linking). Иначе ответ будет считаться некорректным — и Алиса сообщит пользователю, что навык не отвечает. Яндекс Диалоги фиксируют количество некорректных ответов. Если их слишком много — навык будет заблокирован.

Если пользователь спросил конфиденциальную информацию, а авторизация не поддерживается на поверхности, можно ответить сообщением: «Извините, эта поверхность не поддерживает авторизацию».

Проверить, авторизован ли пользователь

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

  • Наличие заголовка Authorization:

    Authorization: Bearer <access_token>
  • Наличие свойства session.user.access_token:

    ...
      "session": {
        ...
        "user": {
          "user_id": "6C91DA5198D1758C6A9F63A7C5CDDF09359F683B13A18A151FBF4C8B092BB0C2",
          "access_token": "AgAAAAAB4vpbAAApoR1oaCd5yR6eiXSHqOGT8dT"
        },
        ...
      },
      "version": "1.0"
    }

Если в запросе есть токен, для пользователя включена авторизация. Нужно проверить токен и вернуть данные.

Если токена нет или он невалиден — навык должен показать карточку авторизации.

Длина ответа ограничена 5000 символами, длина OAuth-токена и refresh-токена — 2048 символами. Время жизни токенов (свойство expires_in) должно быть целым числом от 1 до 4 294 967 296.

Ответить карточкой авторизации

Ответ навыка должен содержать свойство start_account_linking:
{
  "start_account_linking": {},
  "version": 1.0
}

Когда навык отвечает карточкой авторизации, поле response должно отсутствовать. Если одновременно указаны поля start_account_linking и response — это некорректный ответ. Алиса сообщит пользователю, что навык не отвечает.

Когда Диалоги получат от навыка команду start_account_linking, в окне навыка отобразится кнопка Авторизоваться. Пользователь нажмет кнопку и будет перенаправлен на страницу авторизации. Подробнее см. в разделе Как устроена авторизация в навыке.

Ответить пользователю после авторизации

Когда пользователь авторизуется, Диалоги пришлют навыку запрос со свойством account_linking_complete_event:

{
  "account_linking_complete_event": {},
  "session": {
    "message_id": 0,
    "session_id": "2eac4854-fce721f3-b845abba-20d60",
    "skill_id": "3ad36498-f5rd-4079-a14b-788652932056",
    "user_id": "47C73714B580ED2469056E71081159529FFC676A4E5B059D629A819E857DC2F8",
    "user": {
      "user_id": "6C91DA5198D1758C6A9F63A7C5CDDF09359F683B13A18A151FBF4C8B092BB0C2",
      "access_token": "AgAAAAAB4vpbAAApoR1oaCd5yR6eiXSHqOGT8dT"
    },
    "application": {
      "application_id": "47C73714B580ED2469056E71081159529FFC676A4E5B059D629A819E857DC2F8"
    },
  },
  "version": "1.0"
}
В заголовке Authorization будет токен (этот же токен находится в свойстве запроса session.user.access_token):
Authorization: Bearer <access_token>
Проверьте токен и только после этого показывайте конфиденциальную информацию. Ответ поместите в поле response:
{
  "response": {
    "text": "Вы успешно авторизовались. Ваш баланс 20 рублей.",
    "tts": "Вы успешно авторизовались. Ваш баланс 20 рублей." 
  },
  "version": "1.0"
}

После этого навык должен дальше слушать запросы от Диалогов в обычном режиме.

Чтобы пользователю не пришлось повторять запрос (например, баланса) после авторизации, навык должен вернуть запрашиваемую информацию сразу — в ответе на запрос с полем account_linking_complete_event.

Обратите внимание: после авторизации Диалоги не присылают поле request.command с репликой пользователя. Чтобы реализовать бесшовную авторизацию, сохраните запрос, перед тем как запускать авторизацию.

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

Проверить токен

Когда навык получает запрос с токеном, необходимо проверить его валидность. Убедитесь, что:
  • Токен представляет действительного пользователя на сервере ресурсов.
  • У токена есть права выполнять запрашиваемую операцию.
  • Срок действия токена не истек.

Если запросы не требуют аутентификации на вашем сервере ресурсов, проверять токен необязательно.

Если токен недействителен

Токен может быть недействительным, потому что:
  • Пользователь удалил или изменил параметры аккаунта в вашем сервисе. Например, связал навык с аккаунтом в PhonOn, а затем удалил аккаунт или сменил пароль. Токен, сохраненный Диалогами, будет идентифицировать несуществующего пользователя.
  • Срок действия токена истек, но Диалогам не удалось получить новый токен. Например, при обновлении токена сервер авторизации не ответил вовремя (при использовании refresh-токенов).

Если токен недействителен, навык должен показать пользователю карточку авторизации. Вы можете объяснить пользователю, почему требуется повторно авторизоваться.

Если используются refresh-токены, Диалоги обновляют токены доступа. Когда срок действия OAuth-токена истекает, Диалоги отправляют запрос на сервер авторизации.

Сервер авторизации должен отдать обновленный токен за пять секунд. Если сервер не ответит, Диалоги отправят повторный запрос. Если через пять секунд от сервера снова не придет ответ, авторизация прекратится. Пользователю потребуется повторно связать аккаунты.

Подробнее о refresh-токенах см. в спецификации к OAuth 2.0.