Проверка подлинности с помощью API бота Подключение or
Бот взаимодействует со службой Bot Connector по протоколу HTTP через защищенный канал (SSL/TLS). Запрос, отправляемый ботом в службу Bot Connector, должен содержать сведения, с помощью которых служба будет проверять удостоверение бота. Точно так же, когда служба Bot Connector отправляет запрос боту, она должна включить в него сведения, с помощью которых бот проверит удостоверение службы. В этой статье описываются технологии проверки подлинности и требования к проверке подлинности уровня службы, выполняемой между ботом и службой Bot Connector. Если вы пишете собственный код проверки подлинности, необходимо реализовать процедуры безопасности, описанные в этой статье, чтобы бот мог обмениваться сообщениями со службой Bot Подключение or.
Важно!
Если вы пишете собственный код проверки подлинности, важно правильно реализовать все процедуры безопасности. После выполнения всех действий в этой статье снижается вероятность прочтения злоумышленником сообщений, отправляемых боту, уменьшается риск отправки сообщений, олицетворяющих бот, и кражи секретных ключей.
Если вы используете пакет SDK Bot Framework, вам не нужно реализовать процедуры безопасности, описанные в этой статье, так как пакет SDK автоматически делает его для вас. Просто настройте проект с использованием идентификатора приложения и пароля, полученных для бота во время регистрации, а все остальное сделает пакет SDK.
Технологии проверки подлинности
Для установления доверительных отношений между ботом и службой Bot Connector используются следующие четыре технологии проверки подлинности.
Технология | Description |
---|---|
SSL/TLS | SSL/TLS используется для всех подключений между службами. Сертификаты X.509v3 используются для идентификации всех служб HTTPS. Клиенты всегда должны проверять сертификаты службы, чтобы убедиться в их надежности и допустимости. (В рамках этой схемы сертификаты клиента не используются.) |
OAuth 2.0 | OAuth 2.0 использует службу входа учетной записи Идентификатора Майкрософт для создания безопасного маркера, который бот может использовать для отправки сообщений. Этот маркер работает между службами. Вход пользователя не требуется. |
JSON Web Token (JWT) | JSON Web Token используется для кодирования маркеров, отправляемых ботам и из них. Клиенты должны полностью проверять все получаемые маркеры JWT в соответствии с требованиями, описанными в этой статье. |
Метаданные OpenID | Служба Bot Connector публикует список допустимых маркеров, используемых для подписи собственных маркеров JWT в метаданных OpenID в хорошо известной статической конечной точке. |
В этой статье описывается, как использовать эти технологии с помощью стандартных форматов HTTPS и JSON. Специальные пакеты SDK не требуются, хотя вы можете найти, что вспомогательные средства для OpenID и другие полезны.
Проверка подлинности запросов от бота к службе бота Подключение or
Для взаимодействия со службой Bot Connector необходимо указать маркер доступа в заголовке Authorization
каждого запроса API, используя следующий формат:
Authorization: Bearer ACCESS_TOKEN
Чтобы получить и использовать токен JWT для бота, выполните следующее:
- Бот отправляет HTTP-запрос GET в службу входа MSA.
- Ответ от службы содержит маркер JWT для использования.
- Бот включает этот токен JWT в заголовок авторизации в запросах к службе Bot Подключение or.
Шаг 1. Запрос маркера доступа из службы входа учетной записи Идентификатора Microsoft Entra
Важно!
Если вы еще этого не сделали, необходимо зарегистрировать бот в Bot Framework, чтобы получить его AppID и пароль. Идентификатор приложения и пароль бота потребуются для запроса маркера доступа.
Удостоверение бота можно управлять в Azure несколькими способами.
- В качестве управляемого удостоверения, назначаемого пользователем, поэтому вам не нужно самостоятельно управлять учетными данными бота.
- Как однотенантное приложение.
- В качестве мультитенантного приложения.
Запрос маркера доступа на основе типа приложения бота.
Чтобы запросить маркер доступа из службы входа, выполните следующий запрос, заменив microsoft-APP-ID и MICROSOFT-APP-PASSWORD идентификатором appID бота и паролем, полученными при регистрации бота в Служба Bot.
POST https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=MICROSOFT-APP-ID&client_secret=MICROSOFT-APP-PASSWORD&scope=https%3A%2F%2Fapi.botframework.com%2F.default
Шаг 2. Получение маркера JWT из ответа службы входа учетной записи идентификатора Microsoft Entra ID
Если приложение авторизовано службой входа, в тексте ответа JSON будет указан маркер доступа, его тип и срок действия (в секундах).
При добавлении маркера в Authorization
заголовок запроса необходимо использовать точное значение, указанное в этом ответе, не экранируйте или не кодируйте значение маркера. Маркер доступа действителен до окончания срока его действия. Чтобы предотвратить влияние окончания срока действия маркера на производительность бота, маркер можно кэшировать и заранее обновить.
В этом примере показан ответ службы входа учетной записи Microsoft Entra ID:
HTTP/1.1 200 OK
... (other headers)
{
"token_type":"Bearer",
"expires_in":3600,
"ext_expires_in":3600,
"access_token":"eyJhbGciOiJIUzI1Ni..."
}
Шаг 3. Указание маркера JWT в заголовке авторизации запросов
При отправке запроса API в службу Bot Connector укажите маркер доступа в заголовке Authorization
каждого запроса API, используя следующий формат:
Authorization: Bearer ACCESS_TOKEN
Все запросы, отправляемые в службу Bot Connector, должны содержать маркер доступа в заголовке Authorization
.
Если маркер правильно сформирован, срок действия истек и создан службой входа учетной записи идентификатора Microsoft Entra ID, служба бота Подключение or будет авторизовать запрос. Чтобы убедиться, что маркер принадлежит боту, который отправил запрос, выполняются дополнительные проверки.
В следующем примере показано, как указать маркер доступа в заголовке Authorization
запроса.
POST https://smba.trafficmanager.net/teams/v3/conversations/12345/activities
Authorization: Bearer eyJhbGciOiJIUzI1Ni...
(JSON-serialized Activity message goes here)
Важно!
Маркер JWT следует задавать только в заголовке Authorization
запросов, отправляемых в службу Bot Connector.
Не отправляйте маркер через незащищенные каналы и не включайте его в HTTP-запросы, отправляемые в другие службы.
Маркер JWT, полученный из службы входа учетной записи Microsoft Entra ID, похож на пароль и должен обрабатываться с большим вниманием. Пользователь, обладающий маркером, может использовать его для выполнения операций от имени вашего бота.
Запрос от бота к службе Bot Connector: пример компонентов JWT
header:
{
typ: "JWT",
alg: "RS256",
x5t: "<SIGNING KEY ID>",
kid: "<SIGNING KEY ID>"
},
payload:
{
aud: "https://api.botframework.com",
iss: "https://sts.windows.net/d6d49420-f39b-4df7-a1dc-d59a935871db/",
nbf: 1481049243,
exp: 1481053143,
appid: "<YOUR MICROSOFT APP ID>",
... other fields follow
}
Примечание.
На практике могут использоваться другие поля. Создайте и проверьте все маркеры JWT, как указано выше.
Проверка подлинности запросов из службы Бота Подключение or в бот
Когда служба Bot Connector отправляет запрос боту, она указывает подписанный маркер JWT в заголовке Authorization
запроса. Бот может проверить подлинность вызовов от службы Bot Connector, проверив подлинность подписанного маркера JWT.
Для проверки подлинности вызовов из службы бота Подключение or:
- Бот получает токен JWT из заголовка авторизации в запросах, отправленных из службы бота Подключение or.
- Бот получает документ метаданных OpenID для службы бота Подключение or.
- Бот получает список допустимых ключей подписывания из документа.
- Бот проверяет подлинность токена JWT.
Шаг 2. Получение документа метаданных OpenID
Документ метаданных OpenID указывает расположение второго документа, в котором приведены допустимые ключи подписи службы Bot Connector. Чтобы получить документ метаданных OpenID, выполните следующий запрос по протоколу HTTPS:
GET https://login.botframework.com/v1/.well-known/openidconfiguration
Совет
Это статический URL-адрес, который можно жестко задать в приложении.
В следующем примере показан документ метаданных OpenID, возвращаемый в ответ на запрос GET
. Свойство jwks_uri
указывает расположение документа, который содержит допустимые ключи подписи службы Bot Connector.
{
"issuer": "https://api.botframework.com",
"authorization_endpoint": "https://invalid.botframework.com",
"jwks_uri": "https://login.botframework.com/v1/.well-known/keys",
"id_token_signing_alg_values_supported": [
"RS256"
],
"token_endpoint_auth_methods_supported": [
"private_key_jwt"
]
}
Шаг 3. Получение списка допустимых ключей подписывания
Чтобы получить список допустимых ключей подписи, отправьте запрос GET
по протоколу HTTPS на URL-адрес, указанный в свойстве jwks_uri
в документе метаданных OpenID. Например:
GET https://login.botframework.com/v1/.well-known/keys
В тексте ответа указан документ в формате JWK и также содержатся дополнительные свойства для каждого ключа: endorsements
.
Совет
Список ключей является стабильным и может быть кэширован, но новые ключи могут быть добавлены в любое время. Чтобы бот получил актуальную копию документа до использования этих ключей, все экземпляры ботов должны обновлять локальный кэш документа по крайней мере один раз каждые 24 часа.
Свойство endorsements
в каждом ключе содержит одну или несколько строк подтверждения, которые можно использовать для проверки подлинности идентификатора канала, указанного в channelId
свойстве объекта Activity для входящего запроса. Список идентификаторов каналов, требующих подтверждения, настраивается в каждом боте. По умолчанию в список будут входить все опубликованные идентификаторы каналов, однако разработчики ботов могут переопределить выбранные значения идентификаторов.
Шаг 4. Проверка маркера JWT
Чтобы проверить подлинность маркера, отправленного службой Bot Connector, необходимо извлечь его из заголовка Authorization
запроса, проанализировать, проверить его содержимое и подпись.
Библиотеки синтаксического анализа JWT доступны для многих платформ, и большинство из них реализуют безопасный и надежный синтаксический анализ для токенов JWT, хотя обычно эти библиотеки необходимо настроить, чтобы определенные характеристики маркера (его издатель, аудитория и т. д.) содержали правильные значения. При анализе маркера необходимо настроить библиотеку анализа или написать собственную процедуру проверки маркера, чтобы маркер соответствовал приведенным ниже требованиям.
- Маркер был отправлен в заголовке HTTP
Authorization
со схемой носителя. - Маркер имеет допустимый формат JSON, соответствующий стандарту JWT.
- Маркер содержит утверждение "issuer" со значением
https://api.botframework.com
. - Маркер содержит утверждение "audience" со значением, соответствующим идентификатору приложения Майкрософт для бота.
- Маркер является действующим. Отраслевая разница в показаниях часов составляет 5 минут.
- Маркер имеет допустимую криптографическую подпись с ключом, приведенным в документе с ключами OpenID, который был получен на шаге 3, и алгоритмом подписи, который указан в свойстве
id_token_signing_alg_values_supported
документа метаданных OpenID, который был получен на шаге 2. - Маркер содержит утверждение serviceUrl со значением, которое соответствует свойству
serviceUrl
в корне объекта Activity входящего запроса.
Если требуется подтверждение для идентификатора канала:
- любой объект
Activity
, отправляемый в бот с этим идентификатором канала, должен сопровождаться маркером JWT, который подписан с использованием подтверждения для этого канала; - Если подтверждение отсутствует, бот должен отклонить запрос, возвращая код состояния HTTP 403 (запрещено ).
Важно!
Все эти требования являются важными, особенно требования 4 и 6. При невозможности выполнить все эти требования бот будет открыт для атак, что может привести к раскрытию его маркера JWT.
Разработчики не должны предоставлять способ отключения проверки маркера JWT, который отправляется боту.
Запрос от службы Bot Connector к боту: пример компонентов JWT
header:
{
typ: "JWT",
alg: "RS256",
x5t: "<SIGNING KEY ID>",
kid: "<SIGNING KEY ID>"
},
payload:
{
aud: "<YOU MICROSOFT APP ID>",
iss: "https://api.botframework.com",
nbf: 1481049243,
exp: 1481053143,
... other fields follow
}
Примечание.
На практике могут использоваться другие поля. Создайте и проверьте все маркеры JWT, как указано выше.
Проверка подлинности запросов из эмулятора Bot Framework в бот
Bot Framework Emulator — это инструмент для настольных систем, используемый для тестирования работоспособности бота. Хотя эмулятор Bot Framework использует те же технологии проверки подлинности, что и описано выше, не удается олицетворить реальную службу бота Подключение or.
Вместо этого он использует идентификатор приложения Майкрософт и пароль приложения Майкрософт, указанный при подключении эмулятора к боту для создания маркеров, идентичных создаваемым ботом.
Когда эмулятор отправляет запрос боту, он указывает токен JWT в Authorization
заголовке запроса, в сущности, используя собственные учетные данные бота для проверки подлинности запроса.
Если вы реализуете библиотеку проверки подлинности и хотите принять запросы из эмулятора Bot Framework, необходимо добавить этот дополнительный путь проверки. Путь структурно похож на путь проверки Подключение or —> путь проверки бота, но он использует документ OpenID MSA вместо документа OpenID бота Подключение or.
Для проверки подлинности вызовов из эмулятора Bot Framework:
- Бот получает токен JWT из заголовка авторизации в запросах, отправленных из эмулятора Bot Framework.
- Бот получает документ метаданных OpenID для службы бота Подключение or.
- Бот получает список допустимых ключей подписывания из документа.
- Бот проверяет подлинность токена JWT.
Шаг 2. Получение документа метаданных OpenID MSA
Документ метаданных OpenID указывает расположение второго документа, в котором перечислены допустимые ключи подписи. Чтобы получить документ метаданных OpenID MSA, отправьте следующий запрос по протоколу HTTPS:
GET https://login.microsoftonline.com/botframework.com/v2.0/.well-known/openid-configuration
В следующем примере показан документ метаданных OpenID, возвращаемый в ответ на запрос GET
. Свойство jwks_uri
указывает расположение документа, который содержит допустимые ключи подписи.
{
"authorization_endpoint":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
"token_endpoint":"https://login.microsoftonline.com/common/oauth2/v2.0/token",
"token_endpoint_auth_methods_supported":["client_secret_post","private_key_jwt"],
"jwks_uri":"https://login.microsoftonline.com/common/discovery/v2.0/keys",
...
}
Шаг 3. Получение списка допустимых ключей подписывания
Чтобы получить список допустимых ключей подписи, отправьте запрос GET
по протоколу HTTPS на URL-адрес, указанный в свойстве jwks_uri
в документе метаданных OpenID. Например:
GET https://login.microsoftonline.com/common/discovery/v2.0/keys
Host: login.microsoftonline.com
В тексте ответа документ указывается в формате JWK.
Шаг 4. Проверка маркера JWT
Чтобы проверить подлинность маркера, отправленного эмулятором, необходимо извлечь маркер из Authorization
заголовка запроса, проанализировать маркер, проверить его содержимое и проверить его подпись.
Библиотеки синтаксического анализа JWT доступны для многих платформ, и большинство из них реализуют безопасный и надежный синтаксический анализ для токенов JWT, хотя обычно эти библиотеки необходимо настроить, чтобы определенные характеристики маркера (его издатель, аудитория и т. д.) содержали правильные значения. При анализе маркера необходимо настроить библиотеку анализа или написать собственную процедуру проверки маркера, чтобы маркер соответствовал приведенным ниже требованиям.
- Маркер был отправлен в заголовке HTTP
Authorization
со схемой носителя. - Маркер имеет допустимый формат JSON, соответствующий стандарту JWT.
- Маркер содержит утверждение "издателя" с одним из выделенных значений для неправительственных случаев. Проверка обоих значений издателя гарантирует, что вы проверка для значений издателя протокола безопасности версии 3.1 и версии 3.2.
- Маркер содержит утверждение "audience" со значением, соответствующим идентификатору приложения Майкрософт для бота.
- Эмулятор, в зависимости от версии, отправляет AppId через утверждение appid (версия 1) или авторизованное утверждение сторонне (версия 2).
- Маркер является действующим. Отраслевая разница в показаниях часов составляет 5 минут.
- Маркер имеет допустимый криптографическую подпись с ключом, приведенным в документе с ключами OpenID, который был получен на шаге 3.
Примечание.
Требование 5 относится к пути проверки эмулятора.
Если маркер не соответствует всем этим требованиям, бот должен завершить запрос, возвращая код состояния HTTP 403 (запрещено ).
Важно!
Все эти требования являются важными, особенно требования 4 и 7. При невозможности выполнить все эти требования бот будет открыт для атак, что может привести к раскрытию его маркера JWT.
Запрос от эмулятора к боту: пример компонентов JWT
header:
{
typ: "JWT",
alg: "RS256",
x5t: "<SIGNING KEY ID>",
kid: "<SIGNING KEY ID>"
},
payload:
{
aud: "<YOUR MICROSOFT APP ID>",
iss: "https://sts.windows.net/d6d49420-f39b-4df7-a1dc-d59a935871db/",
nbf: 1481049243,
exp: 1481053143,
... other fields follow
}
Примечание.
На практике могут использоваться другие поля. Создайте и проверьте все маркеры JWT, как указано выше.
Изменения протокола безопасности
Проверка подлинности бота в службе Bot Connector
URL-адрес входа OAuth
Версия протокола | Допустимое значение |
---|---|
3.1 и 3.2 | https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token |
Область OAuth
Версия протокола | Допустимое значение |
---|---|
3.1 и 3.2 | https://api.botframework.com/.default |
Проверка подлинности службы Bot Connector в боте
Документ метаданных OpenID
Версия протокола | Допустимое значение |
---|---|
3.1 и 3.2 | https://login.botframework.com/v1/.well-known/openidconfiguration |
Издатель JWT
Версия протокола | Допустимое значение |
---|---|
3.1 и 3.2 | https://api.botframework.com |
Проверка подлинности эмулятора в боте
URL-адрес входа OAuth
Версия протокола | Допустимое значение |
---|---|
3.1 и 3.2 | https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token |
Область OAuth
Версия протокола | Допустимое значение |
---|---|
3.1 и 3.2 | Идентификатор приложения Майкрософт бота + /.default |
Аудитория JWT
Версия протокола | Допустимое значение |
---|---|
3.1 и 3.2 | Идентификатор приложения Microsoft Bot |
Издатель JWT
Версия протокола | Допустимое значение |
---|---|
v3.1 1.0 | https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee/ |
v3.1 2.0 | https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0 |
v3.2 1.0 | https://sts.windows.net/f8cdef31-a31e-4b4a-93e4-5f571e91255a/ |
v3.2 2.0 | https://login.microsoftonline.com/f8cdef31-a31e-4b4a-93e4-5f571e91255a/v2.0 |
См. также выделенные значения для неправительственных случаев.
Документ метаданных OpenID
Версия протокола | Допустимое значение |
---|---|
3.1 и 3.2 | https://login.microsoftonline.com/botframework.com/v2.0/.well-known/openid-configuration |