Ejabberd-ejabberd_auth_external:failure:103调用“ check_password”时,外部身份验证程序失败

时间:2019-03-19 08:21:16

标签: xmpp ejabberd ejabberd-module ejabberd-auth

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

  • Node.JS
  • Ejabberd作为XMPP服务器
  • MySQL数据库
  • 本机(前端)
  • 操作系统-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:failure:103外部身份验证   调用admin@example.org.co的“ check_password”时,程序失败:   断开连接

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: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” >>},{<<“ host” >>,<<“ example.org.co” >>},{<<“ password” >>, <<“测试” >>}]   来自:: 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}

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

1 个答案:

答案 0 :(得分:3)

1)您关于auth_method的配置看起来不错。

2)这是我用来升级ejabberd外部身份验证的python脚本。

#!/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()建立通信,遗憾的是找不到源。