无法从 Android 在 Ejabberd 服务器中添加新用户。它给出了禁止(403)

Posted

技术标签:

【中文标题】无法从 Android 在 Ejabberd 服务器中添加新用户。它给出了禁止(403)【英文标题】:Can not add new user in Ejabberd server from Android . its gives forbidden(403) 【发布时间】:2014-12-01 15:42:35 【问题描述】:

我正在使用 Ejabberd Server 和 Xmpp 创建一个聊天应用程序。在这个应用程序中,我想使用 android 代码添加新用户。我使用 asmack-android-8-0.8.10.jar 。我检查了 ***.com 中有关此问题的其他问题,我按照他们所说的做了,但我无法解决问题...

我尝试使用此代码添加新用户,就像有人说的那样:

HashMap<String, String> attr = new HashMap<String, String>();
    attr.put("user", username);
    attr.put("password", password);
        try 
            // Admin login
            connection.login(username, password);
         catch (XMPPException e) 
            e.printStackTrace();
        
    Log.i("connection.isAuthenticated() : ","" + connection.isAuthenticated());
    if (connection.isAuthenticated()) 
        AccountManager manager = new AccountManager(connection);
        try 
            if (manager.supportsAccountCreation())
            
                manager.createAccount(username, password, attr);
            

         catch (XMPPException e) 
            Log.w("[create_user] Cannot create new user: XMPP Exception.","0");
            e.printStackTrace();
         catch (IllegalStateException e) 
            Log.w("[create_user] Cannot create new user: not logged in.", "0");
            e.printStackTrace();
        
    

但它给了我这个错误:

12-01 17:12:32.436: D/SMACK(16442): 05:12:32 PM SENT (1101049376): <iq id="44B8E-6"   to="mehmetcan" type="set"><query xmlns="jabber:iq:register"><password>can123</password>   <user>user2fasf</user><username>user2fasf</username></query></iq>
12-01 17:12:32.626: D/SMACK(16442): 05:12:32 PM RCV  (1101049376): <iq from='mehmetcan' to='admin@mehmetcan/Smack' id='44B8E-6' type='error'><query xmlns='jabber:iq:register'><password>can123</password><user>user2fasf</user><username>user2fasf</username></query><error code='403' type='auth'><forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></iq>
12-01 17:12:32.626: W/[create_user] Cannot create new user: XMPP Exception.(16442): 0
12-01 17:12:32.626: W/System.err(16442): forbidden(403)
12-01 17:12:32.626: W/System.err(16442):    at org.jivesoftware.smack.AccountManager.createAccount(AccountManager.java:243)
12-01 17:12:32.626: W/System.err(16442):    at org.apache.android.xmppClient.XmppUserCreateTask.doInBackground(XmppUserCreateTask.java:66)
12-01 17:12:32.626: W/System.err(16442):    at org.apache.android.xmppClient.XmppUserCreateTask.doInBackground(XmppUserCreateTask.java:1)
12-01 17:12:32.626: W/System.err(16442):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
12-01 17:12:32.626: W/System.err(16442):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
12-01 17:12:32.626: W/System.err(16442):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
12-01 17:12:32.626: W/System.err(16442):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
12-01 17:12:32.626: W/System.err(16442):    at java.lang.Thread.run(Thread.java:856)

然后就像人们说的,在 ejabberd.cfg 文件中,我做了这个更改:

%% Put this in the section ACCESS RULES
access, register_from, [allow, admin].

并将 mod_register 更改为访问 access_from 并注册到 register_from :

mod_register, [
      %%
      %% After successful registration, the user receives 
      %% a message with this subject and body.
      %%
      welcome_message, "Welcome!", 
                 "Welcome to this Jabber server.",

      %%
      %% When a user registers, send a notification to 
      %% these Jabber accounts.
      %%
      %%registration_watchers, ["admin1@example.org"],

      access_from, register_from
     ],

它仍然给我同样的错误:

Cannot create new user: XMPP Exception.(16442): 0 forbidden (403)

如何解决这个问题?这是因为 ejabberd 的一些更新吗?请帮忙..

【问题讨论】:

【参考方案1】:

您只允许您在“管理员”规则中定义的用户注册帐户。您没有发布您如何定义“管理员”。 但是,鉴于您的示例,我希望您希望允许任何人注册帐户。也许,以下就是你想要的?

access, register_from, [allow, all].

【讨论】:

我没有定义任何关于 'admin' 用户的信息 ..如果你说关于 'admin' 用户的信息在哪里,我可以发布你的信息... 我从 this post 获得注册码。我照他们说的做了。现在我也按照你所说的那样更改了cfg文件中的那一行,但它给出了同样的错误。你提供什么? 是的,但他们所说的并不完整。您在这里指的是“管理员”规则。如果它不存在,那么它什么也不做。 okey,我如何定义管理规则并允许他注册某人?我会照你说的做。 这显示在示例 ejabberd 配置文件中。 acl, admin, user, "aleksey", "localhost" 之类的东西。但是,如前所述,我认为你误解了它会做什么,它不会做你想做的事。它将允许管理员用户注册自己的帐户。正如我所提到的,我认为您想要“允许所有人”。请阅读原回复。 这是我的管理规则 acl, admin, user, "admin", "mehmetcan"。我想用不同的用户名注册一些新用户。它们不需要在 cfg 中使用 'admin' 规则进行定义。我想添加它们以便与我的应用程序相互交流。

以上是关于无法从 Android 在 Ejabberd 服务器中添加新用户。它给出了禁止(403)的主要内容,如果未能解决你的问题,请参考以下文章

无法将用户从 iOS 客户端注册到 Ejabberd 服务器 - XMPP

无法从 ejabberd 服务器 15.09 路由自定义数据包

无法连接到 ejabberd 本地主机

无法从 ejabberd 列出 muc 房间

安卓设备的ejabberd服务器登录失败

配置 ejabberd 以用作游戏服务器