Ejabberd — ejabberd_auth_external: сбой: 103 Сбой внешней программы аутентификации при вызове ‘check_password’

#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() и, к сожалению, не могу найти исходники.