Как правильно пройти проверку подлинности из JavaScript в файле HTML для элемента управления веб-чата Microsoft для Bot Framework v4? - PullRequest
0 голосов
/ 27 мая 2019

Моя цель - создать HTML-страницу с JavaScript, которая запускает этот элемент управления веб-чата Microsoft Bot Framework v4

https://github.com/Microsoft/BotFramework-WebChat

Как описано в комментариях к этому вопросу StackOverflow

Размер изображения Microsoft Bot Framework в адаптивной карте

Я попытался следовать примеру кода здесь

https://github.com/compulim/BotFramework-MockBot

специально

BotFramework-WebChat-master \ samples \ 01.a.getting-start-full-bundle

, но не удалось заставить его работать.В другом вопросе, связанном выше, служба поддержки Microsoft сообщила мне, что нужно выполнить аутентификацию другим способом:

Вам необходимо сделать запрос POST на https://directline.botframework.com/v3/directline/tokens/generate с авторизацией: Bearer в заголовке.В качестве альтернативы вы можете использовать const token = напрямую, вместо

Однако в приведенном выше примере кода написано:

Чтобы поговорить с вашим ботом, вы должны использоватьтокен был обменен с использованием вашего секрета прямой линии.Никогда не следует помещать секрет Direct Line в браузер или клиентское приложение.

Если код, предложенный выше, включает JavaScript, включенный в файл HTML, он виден из View Source всем, кто загружает страницу.

Использование секрета DirectLine, по-видимому, нарушает правило не раскрывать этот секрет, который, как я прочитал, может обеспечить доступ ко всем разговорам, не только к текущему.

Если код JS вОбычное представление использует секрет DirectLine для получения токена, затем использует токен для аутентификации, при этом использование токена, похоже, ничего не дает, так как секрет DL раскрывается.Почему бы просто не использовать секрет DL?

Какой рекомендуемый Microsoft самый простой способ аутентификации в элементе управления веб-чатом, указанном выше?

Спасибо!

1 Ответ

1 голос
/ 27 мая 2019

Почему бы просто не использовать секрет DL?

Как вы сказали, это позволит получить доступ ко всем разговорам с ботом.

Если код JS в простом виде использует секрет DirectLine для получения токена, то использует токен для аутентификации, при этом токен ничего не выполняет, так как секрет DL раскрывается.

Исправьте еще раз. Чтобы сохранить свой секрет в секрете, вам нужно настроить свой собственный токен-сервер. У нас нет официального, готового к использованию примера того, как это настроить, но этот пример от автора веб-чата поможет вам начать.

Если вы хотите написать свой собственный, поток будет в основном:

  1. Пусть ваш клиент WebChat отправит запрос на токен вашему серверу токенов
  2. Ваш токен-сервер может хранить секрет в переменной, если вы не делаете код открытым. Пусть ваш токен-сервер достигнет https://directline.botframework.com/v3/directline/tokens/generate с запросом POST и заголовком Authorization: Bearer <YourSecret>
  3. Возвращает токен, полученный в результате этого запроса, обратно клиенту WebChat.
    • Ваш клиент WebChat теперь будет иметь токен без необходимости знать секрет, потому что он использовал промежуточное ПО вашего токен-сервера

Каков рекомендуемый Microsoft самый простой способ аутентификации в элементе управления веб-чатом, указанном выше?

К сожалению, не существует метода, который был бы "простым" и "рекомендуемым". Самое простое - просто использовать свой секрет напрямую. Это хорошо, если вам все равно, что пользовательские разговоры могут быть раскрыты. Однако рекомендуется использовать собственный токен-сервер.


Дополнительное чтение по раскрытию секрета

С этот выпуск GitHub

Для целей этого обсуждения мы собираемся рассматривать секреты и токены как одно и то же. Мы можем подробно рассказать о них позже, если хотите. Сейчас я буду называть их «секретным / жетоном».

Чтобы получить доступ к беседе, вам потребуется секрет / токен и идентификатор беседы. Эти значения иногда склеиваются, а иногда в отдельных переменных. Иногда они находятся в URL, а иногда они хранятся в JavaScript в памяти. Они аналогичны токену пользователя, хранящемуся в файле cookie пользователя.

Во всех случаях эти значения доступны для пользователя, сидящего за своим компьютером. Они могут читать свои собственные URL-адреса, они могут читать свои собственные переменные состояния JavaScript, и они могут читать свои собственные куки.

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

Наш iFrame использует URL для передачи этих параметров, поскольку во многих случаях это достаточный уровень безопасности. (Вы когда-нибудь посещали веб-сайт, вручную извлекали URL-адрес iFrame, отправляли его кому-то еще и ожидали, что ваш сеанс останется закрытым? Вероятно, нет.)

Если вам нужна дополнительная безопасность, вы можете пропустить iFrame и отправить свой собственный секрет / токен внутри JS или cookie. Ваш JS может извлечь это и отправить его в объект JS Web Chat. Когда веб-чат имеет секретный / токен, он использует исключительно HTTP-заголовки авторизации для отправки этих значений в службу Direct Line.

Таким образом, оставить ваш секрет открытым - это не большая сделка, как таковая . Тем не менее, он позволяет гнусному пользователю выдавать себя за любого другого пользователя.

Это является поведением по умолчанию, потому что Directline требуется некоторый способ выяснить, с кем он аутентифицирован для общения. Секрет подтверждает, что с клиентом (веб-чат) все в порядке. Но что подтверждает, что пользователь? Идентификатор пользователя? Но тогда любой пользователь может установить свой собственный идентификатор пользователя и выдать себя за кого-то другого. Единственный способ по-настоящему обезопасить это - реализовать что-то на своем собственном компьютере, которое использует секрет для получения токена Directline, а затем передает его обратно клиенту веб-чата.

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

В общем, эта безопасность важна, только если вы пытаетесь сохранить пользовательские данные. Если ваши пользователи будут начинать новый разговор каждый раз, когда они открывают бота, вы можете просто сгенерировать уникальный идентификатор пользователя и не беспокоиться, если секрет будет раскрыт.

Вот хороший пост в блоге о создании Client Controller (токен-сервер) в C # и Node а также некоторые дополнительные функции / концепции безопасности. .

Вот еще одно сообщение в блоге о дополнительных соображениях безопасности и использовании расширенных функций аутентификации DirectLine

...