1

我已经有一个具有身份验证密钥的用户模式,并希望通过它进行身份验证。我尝试通过 sql 实现身份验证,但由于我的架构结构不同,我遇到了错误,所以我实现了外部身份验证方法。我的应用程序中使用的技术和操作系统是:

  • 节点.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:假

...

另外,是否有任何外部身份验证 javascript 脚本?

这是error.log和ejabberd.log,如下所述

错误日志

2019-03-19 07:19:16.814 [错误] <0.524.0>@ejabberd_auth_external:failure:103 为 admin@example.org.co 调用“check_password”时外部身份验证程序失败:已断开连接

ejabberd.log

2019-03-19 07:19:16.811 [调试] <0.524.0>@ejabberd_http:init:151 S: [{[<<"api">>],mod_http_api},{[<<"admin">> ],ejabberd_web_admin}]

2019-03-19 07:19:16.811 [调试] <0.524.0>@ejabberd_http:process_header:307 (#Port<0.13811>) http 查询:'POST' <<"/api/register">>

2019-03-19 07:19:16.811 [调试] <0.524.0>@ejabberd_http:process:394 [<<"api">>,<<"register">>] 匹配 [<<"api">> ]

2019-03-19 07:19:16.811 [info] <0.364.0>@ejabberd_listener:accept: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">>},{<<"主机">>,<<"example.org.co">>},{<<"password">>,<<"test">>}] 来自 ::ffff:ip

2019-03-19 07:19:16.814 [错误] <0.524.0>@ejabberd_auth_external:failure:103 为 admin@example.org.co 调用“check_password”时外部身份验证程序失败:已断开连接

2019-03-19 07:19:16.814 [调试] <0.524.0>@mod_http_api:extract_auth:171 验证数据无效:{error,invalid_auth}

任何有关此主题的帮助将不胜感激。

4

1 回答 1

3

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

我没有创建与 Ejabberdfrom_ejabberd()和的通信to_ejabberd(),不幸的是无法找到源代码。

于 2019-04-09T15:49:13.080 回答