#xmpp #ejabberd #ejabberd-module #ejabberd-auth
#xmpp #ejabberd #ejabberd-module #ejabberd-auth
Вопрос:
У меня уже есть схема пользователей с ключом аутентификации, и я хотел выполнить аутентификацию с помощью этого. Я пытался реализовать аутентификацию через sql, но из-за другой структуры моей схемы я получал ошибку, и поэтому я внедрил метод внешней аутентификации. Технологии и операционная система, используемые в моем приложении, являются :
- Node.JS
- Ejabberd как XMPP-сервер
- База данных MySQL
- React-Native (интерфейс)
- ОС — Ubuntu 18.04
Я реализовал конфигурацию внешней аутентификации, как указано в https://docs.ejabberd.im/admin/configuration/#external-script и принял php-скрипт https://www.ejabberd.im/files/efiles/check_mysql.php.txt в качестве примера. Но я получаю указанную ниже ошибку в error.log. В ejabberd.yml я выполнил следующую настройку.
…
host_config:
«example.org.co «:
auth_method: [внешняя]
программа extauth_program: «/usr/local/etc/ejabberd/JabberAuth.class.php «
auth_use_cache: false…
Кроме того, существует ли какой-либо внешний скрипт javascript для аутентификации?
Вот error.log и ejabberd.log, как указано ниже
error.log
2019-03-19 07:19:16.814 [ошибка] <0.524.0>@ejabberd_auth_external: сбой: 103 Сбой внешней программы аутентификации при вызове ‘check_password’ для admin@example.org.co : отключен
ejabberd.log
2019-03-19 07:19:16.811 [debug] <0.524.0>@ejabberd_http: инициализация: 151 Сек: [{[<<«api»>>],mod_http_api}, {[<<«admin»>>],ejabberd_web_admin}]
2019-03-19 07:19:16.811 [debug] <0.524.0>@ejabberd_http:process_header:307 (#порт<0.13811>) http-запрос: ‘POST’ <<«/api/register»>>
2019-03-19 07:19:16.811 [debug] <0.524.0>@ejabberd_http: процесс: 394 [<<«api»>>,<<«register»>>] совпадения [<<«api»>>]
2019-03-19 07:19:16.811 [информация] <0.364.0>@ejabberd_listener: принять: 238 (<0.524.0>) Принятое соединение ::ffff: ip -> ::ffff:ip
2019-03-19 07:19:16.814 [информация] <0.524.0>@mod_http_api: журнал: 548 Регистр вызовов API [{<<«пользователь»>>,<<«тест»>>},{<<«хост»>>,<<«example.org.co «>>},{<<«пароль»>>,<<«тест»>>}] с ::ffff:ip
2019-03-19 07:19:16.814 [ошибка] <0.524.0>@ejabberd_auth_external: сбой: 103 Сбой внешней программы аутентификации при вызове ‘check_password’ для admin@example.org.co : отключен
2019-03-19 07:19:16.814 [debug] <0.524.0>@mod_http_api:extract_auth: 171 Неверные данные аутентификации: {ошибка,invalid_auth}
Будем признательны за любую помощь по этому вопросу.
Ответ №1:
1) Ваша конфигурация auth_method выглядит хорошо.
2) Вот скрипт на python, который я использовал и обновил, чтобы выполнить внешнюю аутентификацию для ejabberd.
#!/usr/bin/python
import sys
from struct import *
import os
def openAuth(args):
(user, server, password) = args
# Implement your interactions with your service / database
# Return True or False
return True
def openIsuser(args):
(user, server) = args
# Implement your interactions with your service / database
# Return True or False
return True
def loop():
switcher = {
"auth": openAuth,
"isuser": openIsuser,
"setpass": lambda(none): True,
"tryregister": lambda(none): False,
"removeuser": lambda(none): False,
"removeuser3": lambda(none): False,
}
data = from_ejabberd()
to_ejabberd(switcher.get(data[0], lambda(none): False)(data[1:]))
loop()
def from_ejabberd():
input_length = sys.stdin.read(2)
(size,) = unpack('>h', input_length)
return sys.stdin.read(size).split(':')
def to_ejabberd(result):
if result:
sys.stdout.write('x00x02x00x01')
else:
sys.stdout.write('x00x02x00x00')
sys.stdout.flush()
if __name__ == "__main__":
try:
loop()
except error:
pass
Я не создавал связь с Ejabberd from_ejabberd()
и to_ejabberd()
и, к сожалению, не могу найти исходники.