Интерфейс шлюза Asterisk (AGI) – Asterisk IP-телефония

Что такое веб-токены json?

Обмен данными между сторонами будет осуществляться в безопасном режиме с использованием J SON и веб-токенов (JWT). Это называется плагиатом в спецификации RFC 7519, созданной Internet Engineering Task Force (IETF).

Введение

В этой статье мы рассмотрим функциональность и смысл JSON Web Tokens.

Вам не нужно беспокоиться о его создании, если вы не знакомы с JSON Web Tokens (JWT), поскольку мы обсудим его после этого.

Выбор пользователей Express и Javascript ES6 предпочтителен для раздела о реализации в целом.

Async agi

Когда вы используете async AGI,
команды выдаются с помощью диспетчера
действий AGI. Чтобы увидеть встроенную
документацию для действия
менеджера AGI, запустите manager
show AGI в Asterisk CLI. Демонстрация поможет
выяснить, как команды AGI выполняются с
использованием метода async AGI. Сначала в
диалплане создается расширение, которое
запускает сеанс async AGI на канале:

exten => 7011,1,AGI(agi:async)

Когда приложение диалплана
AGI выполняется, событие диспетчера,
называемое AsyncAGI, будет отправлено во
все переменные среды AGI. Подробная
информация об этом событии находится
в разделе «Async
AGI«. После этого действия диспетчера
AGI могут начинаться через AMI.

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

Аги в действии

Channel: SIP/0004F2060EB4-00000013

My-Action-ID-это идентификатор действия.

My-Command-ID является идентификатором команды.

Command: VERBOSE «Puppies like
cotton candy.» 1

Ответ: положительный

My-Action-ID-это идентификатор действия.

В очередь добавлена команда AGI

Д ЕЯТЕЛЬНОСТЬ: Асинкейги

Приоритет: Agi, все

Заместитель: исполнительный

Channel: SIP/0004F2060EB4-00000013

My-Command-ID является идентификатором команды.

200 результатов равны 1

Следующий результат — это то,
что было видно на консоли Asterisk во время
этого сеанса async AGI:

— Executing [[email protected]:1]
AGI(«SIP/0004F2060EB4-00000013»,

«agi:async») in new stack

Щенки наслаждаются сладкой ватой, Agi: Async.

Раздвижение удлинения (телефоны, 7011, 1)

exited non-zero on
‘SIP/0004F2060EB4-00000013’

Async agi-ami-контролируемый
agi

Async AGI — это новый метод
использования AGI, который был впервые
представлен в Asterisk 1.6.0. Цель async AGI —
разрешить приложению, используещему
AMI для асинхронной очереди команд,
выполнение AGI на канале. Это может быть
особенно полезно, если вы уже широко
используете AMI и хотели бы воспользоваться
одним и тем же приложением для обработки
управления вызовами, в отличие от
написания подробного диалплана Asterisk
или разработки отдельного сервера
FastAGI.

Более подробную
информацию об AMI
можно найти в Главе 20.

Async AGI вызывается
приложением AGI().
Аргументом для AGI()
должен быть agi:async,
как показано в следующем примере:

exten => 1234,1,AGI(agi:async)

Дополнительную
информацию о том, как
использовать async AGI через
AMI, можно найти в следующем разделе.

Плюсы
async AGI

Существующее
приложение AMI может использоваться для
управления вызовами с использованием
команд AGI.

Недостатки
async AGI

Это
самый сложный способ реализации AGI.

Deadagi is dead

В версиях Asterisk до 1.8, было
приложение называемое
DeadAGI(). Его цель
была аналогична цели AGI(),
за исключением того, что вы использовали
ее на канале, который уже повесил трубку.
Обычно это делается в специальном
расширении h,
когда хотите использовать приложение
AGI, чтобы помочь в некоторых типах
обработки после вызова.

Вызов DeadAGI()
из диалплана будет по-прежнему работать,
но вы получите сообщение
WARNING
в логе Asterisk. Он устарел
в пользу использования AGI()
во всех случаях. Код для AGI()
был обновлен, поэтому он знает как
правильно настроить работу после
завершения вызова канала.

Плюсы
DeadAGI

Нет. Он
мертв.

Недостатки
DeadAGI

Он
мертв. На самом деле, не используйте
его. Если вы это сделаете, ваша конфигурация
может сломаться, если DeadAGI()
полностью удалят из
Asterisk в будущей версии.

Fastagi-agi через tcp

FastAGI — это термин, используемый
для управления вызовами AGI через
TCP-соединение. С AGI на основе процессов
экземпляр приложения AGI выполняется в
системе для каждого вызова, а связь с
этим приложением выполняется посредством
stdin и stdout.

С FastAGI TCP-соединение
выполняется на сервере FastAGI. Управление
вызовами выполняется с использованием
одного и того же протокола AGI, но связь
осуществляется по TCP-соединению и не
требует запуска нового процесса для
каждого вызова. Протокол AGI обсуждается
более подробно в «Обзор
связи AGI«.Использование
FastAGI гораздо более масштабируемо, чем
AGI на основе процессов, хотя его также
сложнее реализовать.

FastAGI используется при вызове
приложения AGI(),
но вместо указания имени исполняемого
приложения вы указываете
agi://
URL-адрес. Например:

exten => 1234,1,AGI(agi://127.0.0.1)

Номер порта по умолчанию для
подключения FastAGI — 4573.
Другой номер порта может быть добавлен
к URL после двоеточия. Например:

exten =>
1234,1,AGI(agi://127.0.0.1:4574)

Так же как и с AGI на основе
процессов, аргументы могут быть переданы
в приложение FastAGI. Для этого добавьте
их в качестве дополнительных аргументов
в приложении AGI(),
разделенных запятыми:

exten =>
1234,1,AGI(agi://192.168.1.199,arg1,arg2,arg3)

FastAGI также поддерживает
использование Service records
записи (SRV-записи), если вы указываете
URL-адрес в виде hagi://.
Используя записи SRV, вы можете перечислить
несколько хостов, к которым Asterisk может
попытаться подключиться для высокой
доступности и балансировки нагрузки.

exten =>
1234,1,AGI(hagi://shifteight.org)

Плюсы
FastAGI

Он более
эффективен, чем AGI на основе процессов.
Вместо того, чтобы создавать процесс
на вызов, сервер FastAGI может
обрабатывать множество вызовов.

Может
использоваться DNS для обеспечения
высокой доступности и балансировки
нагрузки между серверами FastAGI для
дальнейшего повышения масштабируемости.

Недостатки
FastAGI.

Сложнее
реализовать сервер FastAGI, чем приложение
AGI на основе процессов. Тем не менее,
внедрение TCP-сервера было сделано намного
раньше, поэтому есть множество примеров,
доступных практически для любого языка
программирования.

Process-based agi

Process-Based AGI
(на основе
процессов) — это самый
простой вариант AGI. Пример быстрого
запуска в начале этой главы является
примером сценария AGI на основе процесса.
Сценарий вызывается с использованием
приложения AGI()
из диалплана Asterisk.

Приложение для запуска
указано как первый аргумент AGI().
Если не указан полный путь, ожидается,
что приложение будет находиться
в каталоге
/var/lib/asterisk/agi-bin. Аргументы, которые
необходимо передать вашему приложению
AGI, могут быть указаны в качестве
дополнительных аргументов для AGI()
в диалплане Asterisk. Синтаксис:

AGI(command[,arg1[,arg2[,…]]])

Убедитесь, что у
вашего приложения установлены
соответствующие разрешения, чтобы
пользователь процесса Asterisk имел
разрешения на его выполнение. В противном
случае AGI() завершится
ошибкой.

После того, как Asterisk выполнит
ваше приложение AGI, связь между Asterisk и
вашим приложением будет проходить через
stdin и stdout. Более подробно об этом
сообщении будет освещено
в “Обзор
связи AGI”. Дополнительные сведения
о вызове AGI() из
диалплана см. в
документации, встроенной в Asterisk:

* CLI> core show applicationAGI

Плюсы
AGI на основе процессов

Это
простейшая форма AGI для реализации.

Недостатки
AGI на основе процессов

Это
наименее эффективная форма AGI в отношении
потребления ресурсов. Системы с высокой
нагрузкой должны учитывать FastAGI,
обсуждаемые в «FastAGI-AGI
через TCP» вместо
этого.

Process-based agi/fastagi

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

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

Это область, в
которой изменилось поведение после
Asterisk 1.4. В Asterisk 1.4 и более ранних версиях
AGI автоматически выходил и останавливал
работу, как только канал завершался.
Теперь это дает вашему
приложению возможность продолжить
работу при необходимости.

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

Следующее что происходит
после завершения канала
заключается в том, что явное уведомление
о завершении отправляется
в ваше приложение. Для Process-Based
AGI сигнал SIGHUP
будет отправлен процессу для уведомления
об отключении. Для подключения FastAGI
Asterisk отправит строку, содержащую слово
HANGUP.

; Не отправлять SIGHUP в
процесс AGI

; или строку
«HANGUP» на сервер FastAGI.

exten => 500,1,Set(AGISIGHUP=no)

same => n,AGI(my-agi-application)

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

Process-based
agi/fastagi

Для приложения Process-Based
AGI или подключения к серверу FastAGI
переменные, перечисленные в Таблице
21-1, будут первыми данными, отправленными
из Asterisk в ваше приложение. Каждая
переменная будет в отдельной строке, в
виде:

Значение для agi_variable

Таблица
21-1. Переменные среды AGI

Переменная Значение/Пример Описание
agi_request hello-world.sh Первый аргумент, переданный
приложению AGI()
или EAGI(). Для AGI
на основе процесса это имя приложения
AGI, которое было выполнено. Для FastAGI
это был бы URL, который использовался
для достижения сервера FastAGI.
agi_channel SIP/0004F2060EB4-00000009 Имя канала, который выполнил
приложение AGI()
или EAGI().
agi_language en Язык, установленный на
agi_channel.
agi_type SIP Тип канала для agi_channel.
agi_uniqueid 1284382003.9 Уникальный
идентификатор в agi_channel.
agi_version 1.8.0-beta4 Используемая версия
Asterisk.
agi_callerid 12565551212 Полная строка
CallerID, которая
установлена на
agi_channel.
agi_calleridname Russell
Bryant
CallerID name,
заданное в agi_channel.
agi_callingpres 0 Представление абонента,
связанное с CallerID,
заданное на agi_channel.
Дополнительные сведения см. в
выходных данных core
show
function CALLERPRES
в CLI Asterisk.
agi_callingani2 0 ANI2 абонента, связанное
с agi_channel.
agi_callington 0 CallerID TON (тип
номера), связанный с
agi_channel.
agi_callingtns 0 Набранный номер TNS (Transit
Network Select), связанный с agi_channel.
agi_dnid 7010 Набранный номер, связанный
с agi_channel.
agi_rdnis unknown Номер перенаправления,
связанный с agi_channel.
agi_context phones Контекст диалплана,
в котором находился agi_channel
при выполнении приложения AGI()
или EAGI().
agi_extension 500 Внутр.номер
в диалплане, который
выполнял agi_channel
при запуске приложения AGI()
или EAGI().
agi_priority 1 Приоритет agi_extension
в agi_context, который
выполнил AGI()
или EAGI().
agi_enhanced 0.0 Указание на то, использовался
ли AGI() или EAGI()
из диалплана. 0.0
указывает на использование метода
AGI(), 1.0
— на EAGI().
agi_accountcode myaccount accountcode,
связанный
с agi_channel.
agi_threadid 140071216785168 threadid
потока в Asterisk, в котором выполняется
приложение AGI()
или EAGI(). Это
может быть полезно для связывания
журналов, созданных приложением AGI,
с журналами, созданными Asterisk, так как
журналы Asterisk содержат идентификаторы
потоков.
agi_arg_<argument
number>
my argument Эти переменные предоставляют
содержимое дополнительных аргументов,
предоставленных приложению AGI()
или EAGI().

Пример переменных, которые
могут быть отправлены в приложение AGI,
см. в отчете об отладке
связи AGI в «Быстрый
старт«. Конец списка
переменных указывается пустой строкой.
Пример 21-1обрабатывает эти переменные, считывая
строки ввода в цикле до тех пор, пока не
будет получена пустая
строка. В этот момент приложение
продолжает работу и начинает выполнение
команд AGI.

Аутентификация по ключам доступа

Этот способ чаще всего используется для аутентификации устройств, сервисов или других приложений при обращении к веб-сервисам. Здесь в качестве секрета применяются ключи доступа (
access key, API key

Аутентификация по одноразовым паролям

Аутентификация по одноразовым паролям обычно применяется дополнительно к аутентификации по паролям для реализации
two-factor authentication
(2FA). В этой концепции пользователю необходимо предоставить данные двух типов для входа в систему: что-то, что он знает (например, пароль), и что-то, чем он владеет (например, устройство для генерации одноразовых паролей). Наличие двух факторов позволяет в значительной степени увеличить уровень безопасности, что м. б. востребовано для определенных видов веб-приложений.

Одно из самых распространенных применений одноразовых паролей – дополнительная аутентификация пользователя для таких ключевых операций, как изменение настроек и перевод денег.

Одноразовые пароли могут быть созданы различными способами. Наиболее распространенными являются:

  1. Аппаратные или программные токены, которые могут генерировать одноразовые коды на основе введенного в них секретного ключа и текущего времени. Секретные ключи пользователей также хранятся на сервере в качестве фактора владельца для проверки введенных одноразовых кодов. Примером аппаратной реализации токена является RSA SecurID; программная реализация – приложение Google Authenticator.
  2. Случайно сгенерированные коды, отправленные пользователю через SMS или другой канал связи. В этой ситуации фактором собственности является телефон пользователя (точнее, SIM-карта, связанная с определенным номером).
  3. Распечатка или скретч-карта со списком ранее сгенерированных одноразовых паролей. Для каждого нового входа в систему необходимо ввести новый одноразовый пароль с указанным номером.

Интерфейс шлюза Asterisk (AGI) - Asterisk IP-телефония
Аппаратный токен RSA SecurID генерирует новый код каждые 30 секунд.

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

Аутентификация по сертификатам

Сертификат представляет собой набор атрибутов, идентифицирующих владельца, подписанный
certificate authority
(CA). CA выступает в роли посредника, который гарантирует подлинность сертификатов (по аналогии с ФМС, выпускающей паспорта). Также сертификат криптографически связан с закрытым ключом, который хранится у владельца сертификата и позволяет однозначно подтвердить факт владения сертификатом.

На стороне клиента операционная система, компьютер (смарт-карта) или USB-токен могут хранить сертификат вместе с закрытым ключом. Для защиты закрытого ключа может использоваться PIN-код или пароль.

Веб-приложения обычно используют сертификаты X.509, которые являются компонентом протокола SSL/TLS и не являются стандартным методом передачи данных по сетям. Браузеры, поддерживающие этот механизм, позволяют пользователю выбрать и использовать сертификат, если таковой имеется.

Интерфейс шлюза Asterisk (AGI) - Asterisk IP-телефония
Использование сертификата для аутентификации.

Следующие указания используются сервером для проверки сертификата при аутентификации:

  1. Сертификат должен быть подписан доверенным центром сертификации (проверка цепочки сертификатов).
  2. Сертификат должен быть действителен на текущую дату (проверка действительности).
  3. Сертификат не должен быть отозван соответствующим центром сертификации (проверка списка исключений).

Интерфейс шлюза Asterisk (AGI) - Asterisk IP-телефония
Пример X.509 сертификата.

Веб-приложение может разрешить запрос на основе данных сертификата, таких как субъект (имя владельца), эмитент или издатель и отпечаток пальца, после успешной аутентификации.

Сертификаты, как правило, являются более надежным методом аутентификации. Для этого необходимо создать цифровую подпись, подтверждающую использование закрытого ключа в определенных обстоятельствах (неотрицание).

Аутентификация по токенам

Такой способ аутентификации чаще всего применяется при построении распределенных систем
Single Sign-On
(SSO), где одно приложение (
service provider
или
relying party
) делегирует функцию аутентификации пользователей другому приложению (
identity provider
или
authentication service
). Типичный пример этого способа — вход в приложение через учетную запись в социальных сетях. Здесь социальные сети являются сервисами аутентификации, а приложение
доверяет
функцию аутентификации пользователей социальным сетям.

Этот метод реализуется на практике благодаря тому, что поставщик идентификационных данных (IP) предоставляет точные данные о пользователе.

  1. Клиент аутентифицируется с поставщиком идентификационных данных одним из способов, специфичных для клиента (пароль, ключ доступа, сертификат, Kerberos и т.д.).
  2. Клиент просит поставщика идентификационных данных предоставить токен для конкретного приложения SP. Поставщик идентификационных данных генерирует маркер и отправляет его клиенту.
  3. Клиент аутентифицируется с приложением SP с помощью этого маркера.

Интерфейс шлюза Asterisk (AGI) - Asterisk IP-телефония
Пример аутентификации «активного» клиента при помощи токена, переданного посредством Bearer схемы.

Приложение для iOS или Android, например, является активным клиентом, который использует упомянутую выше процедуру в качестве механизма аутентификации. С другой стороны, браузер выступает в роли пассивного клиента и только показывает страницы пользователя.

Интерфейс шлюза Asterisk (AGI) - Asterisk IP-телефония
Пример аутентификации «пассивного» клиента посредством перенаправления запросов.

Существует ряд стандартов, которые точно определяют протоколы для взаимодействия клиентов (активных и пассивных) с приложениями IP/SP. Два наиболее широко используемых стандарта – ID и OpenID. В статье вы можете узнать больше об этих протоколах.

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

S P-приложение выполнит следующие проверки:

  1. Токен был выпущен доверенным приложением поставщика идентификационных данных (проверьте поле Issuer).
  2. Токен предназначен для текущего приложения SP (проверьте поле audience).
  3. Срок действия токена еще не истек (проверьте поле expiry date).
  4. Токен является подлинным и не был изменен (проверьте поле подписи).

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

Быстрый старт

В этом разделе
приведен краткий пример использования
AGI. Сначала добавьте следующую строку
в /etc/asterisk/extensions.conf:

exten => 500,1,AGI(hello-world.sh)

Затем создайте
скрипт hello-world.sh в
/var/lib/asterisk/agi-bin, как показано в Примере
21-1

Пример
21-1. Пример сценария AGI, hello-world.sh

#!/bin/bash

# Использовать все
переменные, отправленные Asterisk

while read VAR && [ -n ${VAR} ] ;
do : ; done

# Ответить на
вызов.

Варианты agi

Существует несколько вариантов
AGI, которые отличаются в основном тем,
что используется для связи с Asterisk. Хорошо
знать все варианты, чтобы вы сделать
лучший выбор в зависимости от потребностей
вашего приложения.

Евразийский гуманитарный институт

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

· электронную копию трудовой книжки;
· электронную копию послужного списка (перечень сведений о работе, трудовой деятельности работника), подписанный работодателем, заверенный печатью организации (при ее наличии);
· электронную копию архивной справки, содержащую сведения о трудовой деятельности работника,
· электронную копию трудового договора с отметкой работодателя о дате и основании его прекращения;
· электронную выписку из актов работодателя, подтверждающих возникновение и прекращение трудовых отношений на основе заключения и прекращения трудового договора;
· электронную копию выписки из ведомости выдачи заработной платы работникам.

Сертификация уровня национального тестирования, которую поставщик услуг получает через информационную систему из соответствующих государственных информационных систем через шлюз “электронного государства”.

Завершение сеанса agi

Сессия AGI
завершается, когда ваше приложение AGI
готово к завершению. Информация о том,
как это происходит, зависит от того,
использует ли ваше приложение Process-Based
AGI, FastAGI или async AGI.

Использование jwt с express

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

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

Введите в терминал пустой файл Node.js:

Далее, давайте активировать Express:.

Команды и ответы

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

AGI обрабатывает
команды последовательно. После выполнения
команды дальнейшие команды не могут
быть выполнены до тех пор, пока Asterisk не
вернет ответ. Выполнение некоторых
команд может занять очень много времени.
Например, команда AGI EXEC
выполняет приложение Asterisk.

Полный список доступных
команд AGI можно получить из консоли
Asterisk, выполнив команду
agi showcommands.
Эти команды описаны в Таблице
21-2. Чтобы получить более подробную
информацию о конкретной команде AGI,
включая синтаксическую информацию для
любых аргументов, ожидаемых командой,
используйте команду agi
show commands topic <

Таблица
21-2. Команды AGI

Команда AGI Описание
ANSWER Ответить на
входящий вызов.
ASYNCAGY
BREAK
Завершить
асинхронный сеанс AGI и
вернуть канал в диалплан
Asterisk.
CHANNEL
STATUS
Получение статуса канала.
Используется для
получения текущего состояния канала,
такого как up (отвечено), down (отклонено)
или ringing.
DATABASE
DEL
Удалить пару
ключ/значение из встроенной базы
данных AstDB.
DATABASE
DELTREE
Удалить
дерево пар ключ/значение из встроенной
базы данных AstDB.
DATABASE
GET
Получить значение для ключа
в AstDB.
DATABASE
PUT
Установите значение для
ключа в AstDB.
EXEC Выполнить приложение
диалплана Asterisk в
канале. Эта команда очень мощная в
том, что между EXEC
и GET FULL VARIABLE вы
можете делать все, что угодно с помощью
вызова, который вы можете сделать из
диалплана Asterisk.
GET
DATA
Считывание цифр вызывающего
абонента.
GET
FULLVARIABLE
Вычислить выражение
диалплана Asterisk.
Можно отправить строку, содержащую
переменные и/или функции диалплана,
а Asterisk вернет результат после выполнения
соответствующих подстановок. Эта
команда очень мощная в том, что между
EXEC и GET
FULL VARIABLE вы можете делать все что
угодно с помощью вызова, который вы
можете сделать из диалплана
Asterisk.
GET
OPTION
Воспроизводить
звуковой файл во время ожидания цифры
от вызывающего абонента. Это похоже
на приложение Background()
диалплана.
GET
VARIABLE
Получение значения переменной
канала.
HANGUP Завершить канал.a
NOOP Ничего не делать. Вы получите
в ответе результат выполнения этой
команды, как и от любой
другой. Её
можно использовать как простой тест
связи с Asterisk.
RECEIVE
CHAR
Получить один
символ. Работает только для типов
каналов, которые поддерживают его,
таких как IAX2 с помощью фреймов TEXT
или SIP с помощью метода MESSAGE.
RECEIVE
TEXT
Получить текстовое сообщение.
Работает в тех же случаях, что и RECEIVE
CHAR.
RECORD
FILE
Записать звук от
вызывающего абонента в файл. Эта
блокирующая операция, аналогичная
приложению диалплана
Record(). Для
записи вызова в фоновом режиме, во
время выполнения других операций,
используйте EXEC
Monitor или EXEC
MixMonitor.
SAY
ALPHA
Произнести строку
символов. Вы можете найти пример этого
в разделе “Быстрый
старт
”. Чтобы получить локализованную
обработку этой и других команд SAY,
установите язык канала либо в файле
конфигурации устройства (например
sip.conf), либо в диалплане
посредством функции CHANNEL(language).
SAY
DIGITS
Произнести
строку цифр. Например,
100 будет звучать как “one
zero zero”, если язык канала установлен
на английский.
SAY
NUMBER
Произнести
число. Например, 100 будет звучать как
“one hundred”, если язык
канала установлен на английский.
SAY
PHONETIC
Произнести
строку символов, но использовать
общее слово для каждой буквы (Альфа,
Браво, Чарли…).
SAY DATE Произнести данную дату.
SAY TIME Произнести данное время.
SAY DATETIME Произнести данную дату и
время, используя указанный формат.
SEND IMAGE Отправить изображение в
канал. IAX2 это поддерживает, но нет
активно развивающихся клиентов IAX2,
о которых мы знаем, чтобы
это поддерживали.
SEND TEXT Отправить текст в
канал, который его поддерживает. Может
использоваться с каналами SIP и IAX2, по
крайней мере.
SET
AUTOHANGUP
Запланировать завершение
канала в определенный
момент времени в будущем.
SET CALLERID Установить
имя и номер вызывающего абонента для
канала.
SET CONTEXT Установить
текущий контекст диалплана
для канала.
SET EXTENSION Установить
текущий внутренний номер
диалплана для
канала.
SET MUSIC Запуск или остановка музыки
в режиме ожидания для
канала.
SET PRIORITY Установить текущий приоритет
диалплана для канала.
SET VARIABLE Задать для
переменной канала данное значение.
STREAM FILE Направить поток
содержимого файла в канал.
CONTROL
STREAM FILE
Направить поток
содержимого файла в канал, но также
позволяет каналу управлять потоком.
Например, канал может приостановить,
перемотать назад или перемотать поток
вперед.
TDD MODE Переключить
режим TDD (телекоммуникационное
устройство для глухих) для
канала.
VERBOSE Отправить
подробное сообщение в логгер
канала. Подробные сообщения
отображаются в консоли Asterisk, если
параметр verbose
достаточно высок. Подробные сообщения
также отправляются в любой файл
журнала, настроенный на
verbose
для логгера канала
в файле /etc/asterisk/logger.conf.
WAIT FOR
DIGIT
Ожидать пока
абонент нажмет цифру.
SPEECH CREATE Инициализация распознавания
речи. Это необходимо сделать перед
использованием других речевых команд
AGI.b
SPEECH SET Настройка речевого движка.
Доступные параметры относятся к
используемому механизму распознавания
речи.
SPEECH
DESTROY
Уничтожить
ресурсы, выделенные для распознавания
речи. Эта команда должна быть последней
выполненной речевой командой.
SPEECH LOAD
GRAMMAR
Загрузить
grammar.
SPEECH UNLOAD
GRAMMAR
Выгрузить
grammar.
SPEECH
ACTIVATE GRAMMAR
Активировать
загруженный grammar.
SPEECH
DEACTIVATE GRAMMAR
Деактивировать grammar.
SPEECH
RECOGNIZE
Воспроизводить
подсказку и выполнять распознавание
речи, а также ожидать
цифры, которые будут нажаты.
GOSUB Выполнить
подпрограмму диалплана.
Она будет выполняться
так же, как и приложение диалплана
GoSub().

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

b
Хотя Asterisk включает основной API для
обработки распознавания речи, он не
поставляется с модулем, обеспечивающим
механизм распознавания речи. В настоящее
время Digium предоставляет два коммерческих
варианта распознавания речи: Lumenvox
и Vestec.

Настройка /etc/asterisk/manager.conf для async agi

«Конфигурация»
в Главе 20 обсуждает параметры
конфигурации manager.conf в подробностях.
Чтобы использовать async AGI учетная запись
AMI должна иметь agi
разрешение read
и write.
Например, следующий определяемый
пользователь в manager.conf
будет определять возможность одновременно
выполнять действия и получать
события AGI диспетчера:

; Определите
пользователя с именем ‘hello’
и паролем ‘world’.

; Дайте этому
пользователю разрешения read/write для
AGI.

[hello]

Мир = секрет

read = agi

Agi = написать

Настройка сеанса agi

После вызова AGI()
или EAGI() из диалплана
Asterisk некоторая информация передается
в приложение AGI для настройки сеанса. В
этом разделе обсуждается, какие шаги
предпринимаются в начале сеанса для
разных вариантов AGI.

Обзор связи agi

В предыдущем разделе обсуждались
варианты AGI, которые можно использовать.
В этом разделе более подробно описано
как ваше пользовательское приложение
AGI взаимодействует с Asterisk после вызова
AGI().

Преимущество использования jwt перед традиционными методами

В отличие от аутентификации на основе сеанса, J WT может хранить все данные, связанные с пользователем.

Веб-приложения можно масштабировать с помощью микросервисов. В настоящее время архитектура современного веб-приложения выглядит примерно так:

Если конкретные ресурсы (такие как CPU или Memory Usage) каждого сервера установлены между ними, то все эти услуги могут быть одинаковыми.

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

Пример: база данных учетных
записей доступа

Пример
21-2 является примером
сценария AGI. Чтобы запустить этот скрипт,
вы должны сначала разместить его в
каталоге /var/lib/asterisk/agi-bin. Затем
выполните его из диалплана Asterisk следующим
образом:

exten =>
agiexample1,1,AGI(agiexample1.py)

Этот пример написан на Python и
задокументирован
повсеместно. Он показывает, как скрипт
может предложить вызывающему
абоненту ввести номер
учетной записи, а затем воспроизвести
некоторую информацию из этой учетной
записи. Что еще более важно, он показывает,
как скрипт AGI взаимодействует с Asterisk
для запуска команд AGI и получения ответа
от Asterisk.

Пример
21-2. agiexample1.py

#!/usr/bin/env python

# Пример для
AGI (Asterisk Gateway Interface).

# Ответить на звонок. Получить номер
аккаунта от вызывающего
абонента и

# воспроизвести
некоторую информацию об учетной
записи вызывающего абонента.

# Разработано
для «Asterisk: The Definitive Guide»

Sys import

# Команды AGI
записываются в stdout. После
обработки команды

# ответ от
Asterisk поступает в stdin.

def agi_command(cmd):

»’Write out the command and return the
response»’

# печатает
отправку команды в stdout.

print cmd

# Убедитесь, что он не
буферизуется.

sys.stdout.flush()

# Прочитать строку
ответа из stdin. Используйте strip(), чтобы
удалить

# любые
пробелы, которые могут присутствовать
(в первую очередь конец

# строки).

return sys.stdin.readline().strip()

# Прочитать переменные среды AGI,
отправленные из Asterisk в скрипт
при запуске.

# Ввод
выглядит:

# agi_request:
example1.py

# agi_channel:
SIP/000FF2266EE4-00000009

# …

# После этого куска кода
Вы сможете получить эту информацию как:

#
asterisk_env[‘agi_request’]

#
asterisk_env[‘agi_channel’]

asterisk_env = {}

Хотя правда:

line = sys.stdin.readline().strip()

Если только Лен (линия),

break

var_name, var_value = line.split(‘:’,
1)

asterisk_env[var_name] = var_value

# Настроить поддельную «базу данных»
учетных записей. В более реалистичном

# скрипте
AGI, который выполняет поиск данных
учетной записи, вы подключитесь к

# внешней базе
данных или другому API для получения
этой информации. Для целей

# данного примера мы
пропустим это и сделаем поиск данных
из этого локального

Примерный комплект содержит несколько вариантов.

Счета =

Баланс: 50 для “12345678”

Баланс: «10» в «11223344»,

Баланс: 100 для ‘87654321’,

# После вызова
используем команду AGI —
ANSWER.

# Смотри:
*CLI> agi show commands topic ANSWER

response = agi_command(‘ANSWER’)

# Попросить абонента
ввести номер учетной записи с помощью
команды GET DATA.

# — Проиграть
приглашение абоненту
please-enter-account-number

# —
Установить время ожидания
30 секунд

# —
Прочитайть максимум 8 цифр (наши номера
аккаунтов — 8 цифр)

# Смотри:
*CLI> agi show commands topic GET DATA

response = agi_command(‘GET DATA
please-enter-account-number 30000 8’)

# Если таймаут
истек, просто выйти обратно в диалплан.

# Ответ будет
выглядеть так:

# 200
result=<digits> (timeout)

Если ответ «тайм -аут»

sys.exit(0)

# Ответ будет
выглядеть так:

# 200
result=<digits>

# число будет
-1 если произошла ошибка.

# Разделить ответ на ‘=’, максимум 1 раз.
В результате получается массив из двух

# элементов. Второй элемент
в массиве (индекс 1) является частью,
которая пришла

# после ‘=’
и является номером аккаунта,
который мы хотим.

account = response.split(‘=’, 1)[1]

# Если произошла ошибка,
просто повесить трубку.

# Смотри:
*CLI> agi show commands topic HANGUP

Если учетная запись равна “-1,”

response = agi_command(‘HANGUP’)

sys.exit(0)

# Если аккаунт
недействителен, сообщить
об этом абоненту и выйти из диалплана.

# Смотри:
*CLI> agi show commands topic STREAM FILE

Если счет не находится в разделе СЧЕТА:

response = agi_command(‘STREAM FILE
invalid-account «»‘)

sys.exit(0)

balance = ACCOUNTS[account][‘balance’]

# Сообщить
абоненту баланс, а затем выйти
обратно в диалплан.

# Смотри:
*CLI> agi show commands topic SAY NUMBER

response = agi_command(‘STREAM FILE
your-balance-is «»‘)

response = agi_command(‘SAY NUMBER %s «»‘
% (balance))

sys.exit(0)

Разработка фреймворков

Был предпринят ряд усилий по
созданию фреймворков или библиотек,
облегчающих Программирование AGI. Таблица
21-3 перечисляет некоторые
из них. Если вы не видите здесь библиотеки
для предпочитаемого языка программирования,
выполните быстрый поиск и вы, скорее
всего, найдете ее как и другие.

Таблица
21-3. Разрабокта фреймворков
AGI

Сервис книг

После этого будет создан файл books.jsp для нашей службы книг!

При переходе на Express вы должны импортировать необходимые библиотеки и настройки приложения.

Давайте просто создадим массив книг для имитации базы данных:

const books = [ { "author": "Chinua Achebe", "country": "Nigeria", "language": "English", "pages": 209, "title": "Things Fall Apart", "year": 1958 }, { "author": "Hans Christian Andersen", "country": "Denmark", "language": "Danish", "pages": 784, "title": "Fairy tales", "year": 1836 }, { "author": "Dante Alighieri", "country": "Italy", "language": "Italian", "pages": 928, "title": "The Divine Comedy", "year": 1315 },
];

Наш текущий алгоритм поиска всех книг из базы данных очень прост:

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

Чтобы подписать JWT, сначала необходимо создать секрет маркера доступа.

Служба аутентификации использует этот маркер. Мы можем аутентифицироваться с помощью службы аутентификации, а затем авторизовать пользователей в службе книги, поскольку они используют общий секрет.

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

Мы прочитали значение заголовка авторизации в промежуточном ПО. Мы разделили его пробелом и выделили токен, поскольку заголовок авторизации содержит значение в формате Bearer [JWT_TOKEN].

Затем мы используем JWT для подтверждения токена. Затем мы присоединяем объект пользователя к запросу после верификации и продолжаем работу. Мы уведомим клиента об ошибке.

Промежуточное программное обеспечение обработчика запроса GET можно настроить следующим образом.

Давайте запустим сервер и проверим, все ли работает так, как нужно:

Служба аутентификации

После этого мы создаем файл под названием auth.js, который будет служить нашей службой аутентификации:

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

Стандарт saml

Стандарт Security Assertion Markup Language (SAML) описывает способы взаимодействия SAML с поставщиком услуг. Версии 1.0 и 1.1 были выпущены в 2002-2003 годах, а версия 2.1 является лишь обратно совместимым расширением стандарта:

Он поддерживает ряд сценариев системной интеграции и является достаточно сложным. Основными компонентами стандарта являются

Стандарты oauth и openid connect

Стандарт OAuth (Open Audiorization) не описывает протокол аутентификации пользователя, в отличие от WS-Federation. Вместо этого он определяет метод получения пользователем доступа к одному из приложений. Но на основе этого стандарта существуют схемы, позволяющие проводить аутентификацию пользователя (подробнее об этом позже).

Текущая версия стандарта была отредактирована и опубликована только сейчас, когда OAuth 2.0 широко используется и получил повсеместное распространение. Первая версия стандарта была создана в период с 2007 по 2022 год.

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

> Попросить пользователя указать данные своей учетной записи? — плохой вариант.> Попросить пользователя создать ключ доступа? — возможно, но весьма сложно.

Здесь объясняется, как приложение для путешествий может получить доступ к почте пользователя с разрешения владельца почты в связи с проблемой доступа к почте пользователя (владельца ресурса). Процедура обычно состоит из следующих шагов:

  1. Пользователь (владелец ресурса) разрешает приложению (клиенту) доступ к ресурсу в форме гранта. Рассмотрим ниже, что такое грант.
  2. Приложение обращается к серверу грантов и получает маркер для доступа к ресурсу в обмен на свой грант. В нашем примере сервером грантов является Google. Когда приложение вызывается, оно проходит дополнительную аутентификацию, используя маркер доступа, полученный при первоначальной регистрации.
  3. Приложение использует этот токен для получения необходимых данных с сервера ресурсов (в нашем случае – службы Gmail).

Интерфейс шлюза Asterisk (AGI) - Asterisk IP-телефония
Взаимодействие компонентов в стандарте OAuth.

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

Стандарты ws-trust и ws-federation

Существуют два стандарта, определяющие сервисы SOAP/XML: WS Federation и WS S-Trust. Эти предприятия являются частью корпорации IBM, Microsoft и других организаций. Эти стандарты, которые в основном используются в корпоративных сценариях, являются довольно сложными в сочетании с SAML.

Secure Token Service (STSD) – это интерфейс службы авторизации, который описывается стандартом WS-Trust. Это служба, которая позволяет создавать и удалять токены. Хотя стандартом допускаются различные форматы токенов, обычно используются токены SAML.

Стандарт WS-Federation фокусируется на протоколе обмена токенами, поскольку он относится к механизму взаимодействия услуг между предприятиями. Сервис STS, описанный в спецификации стандарта WS Trust, имеет свои возможности и интерфейс, расширенные стандартом WS-Federation. Стандарт WS-Federation конкретно определяет:

Можно сказать, что WS-Federation рассматривает те же вопросы и несколько отличается от SAML.

Структура jwt

Давайте поговорим о структуре JWT на примере токена:

Три раздела JWT показаны на изображении справа.

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

Заголовок в Base64-кодировке – это первая часть JWT. Если заголовок декодировать, он будет выглядеть следующим образом:

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

Полезная нагрузка, содержащая объект JSON, находится во второй секции. Однако его легко декодировать, поскольку он закодирован только в Base64.

Рекомендуется избегать включения в JWT конфиденциальной информации, такой как пароли или частная информация.

Тело JWT не обязательно должно выглядеть так, но обычно оно выглядит именно так.

Идентификатор пользователя обычно содержится в свойстве sub. Свойство iat, которое означает issued at и содержит метку времени, когда токен был выпущен, обычно сокращенно называется iat.

Между eat и ehp есть некоторые сходства, которые вы можете заметить.

Подпись токена появляется в этом разделе. Строка base64UrlEncode(header) “хэшируется для ее создания.” base64UrlEncode(payload) секрет с помощью назначенного алгоритма секции заголовка.

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

Сервер может проверить изменения объекта, когда подпись будет отправлена ему обратно.

Вывод

AGI предоставляет мощный
интерфейс Asterisk, который позволяет
реализовать управление вызовами от
первого лица на выбранном языке
программирования. Для реализации
приложения AGI можно использовать
несколько подходов. Некоторые подходы
могут обеспечить более высокую
производительность, но ценой большей
сложности.

Заключение

В этой статье мы описали, как использовать Express для реализации JWT. Надеюсь, теперь у вас есть базовое понимание работы JWT и того, как его можно использовать в вашем проекте.

Как обычно, на GitHub размещен исходный код.

Похожее:  Как настроить двухэтапную аутентификацию в WhatsApp
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *