Ejabberd - ejabberd_auth_external: сбой: 103 Сбой программы внешней аутентификации при вызове 'check_password' - PullRequest
1 голос
/ 19 марта 2019

У меня уже есть схема пользователей с ключом аутентификации, и я хотел сделать аутентификацию через нее.Я пытался реализовать аутентификацию через sql, но из-за разной структуры моей схемы я получал ошибку и поэтому применил метод внешней аутентификации.Технологии и ОС, используемые в моем приложении:

  • Node.JS
  • Ejabberd в качестве XMPP-сервера
  • База данных MySQL
  • React-Native (Front-End)
  • ОС - 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: [external]
extauth_program: "/usr/local/etc/ejabberd/JabberAuth.class.php"
auth_use_cache: false

...

Также есть ли внешниеauth javascript script?

Вот ошибки.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: init: 151 S: [{[<< "api >> >>], mod_http_api}, {[<<"admin" >>], ejabberd_web_admin}]

2019-03-19 07: 19: 16,811 [debug] <0.524.0> @ejabberd_http: process_header: 307 (#Port <0,13811>) http-запрос:'POST' << "/ api / register" >>

2019-03-19 07: 19: 16,811[debug] <0.524.0> @ejabberd_http: process: 394 [<< "api" >>, << "register" >>] соответствует [<< "api" >>]

2019-03-19 07: 19: 16.811 [info] <0.364.0> @ejabberd_listener: принять: 238 (<0.524.0>) Принятое соединение :: ffff: ip -> :: ffff: ip

2019-03-19 07: 19: 16.814 [info] <0.524.0> @mod_http_api: log: 548 регистр вызовов API [{<< "user" >>, << "test" >>}, {<< "host">>, << "example.org.co" >>}, {<< "пароль" >>, << "test" >>}] из :: ffff: ip

2019-03-19 07: 19: 16.814 [ошибка] <0.524.0> @ejabberd_auth_external: сбой: 103 Ошибка внешней программы аутентификации при вызове 'check_password' для admin@example.org.co: отключено

2019-03-1907: 19: 16.814 [debug] <0.524.0> @mod_http_api: extract_auth: 171 Неверные данные аутентификации: {error, invalid_auth}

Любая помощь по этой теме будет принята с благодарностью.

1 Ответ

3 голосов
/ 09 апреля 2019

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('\x00\x02\x00\x01')
    else:
        sys.stdout.write('\x00\x02\x00\x00')
    sys.stdout.flush()

if __name__ == "__main__":
    try:
        loop()
    except error:
        pass

Я не создал связь с Ejabberd from_ejabberd() и to_ejabberd(), и, к сожалению, не могу найти источники.

...