Регистрация нового пользователя Asmack XMPP
Добрые люди из Stackru, пожалуйста, помогите. Я установил сервер ejabberd на моей машине с Ubuntu, добавил виртуальный хост, установил {access, register, [{allow, all}]}. и зарегистрировал учетную запись администратора. Я не гуру Linux, но мне удалось сделать эту базовую настройку. Теперь с моего компьютера с Win 7, используя Pidgin, я могу войти в систему как администратор и получить доступ ко многим административным функциям. Самое главное, я могу создавать новых пользователей на сервере. Проблема в том, что я не могу сделать это с моим клиентом Android, использующим библиотеку asmack. Я могу установить соединение и войти в систему, но когда я пытаюсь зарегистрировать нового пользователя либо через менеджер учетных записей, либо путем отправки пакетов IQ, я получаю сообщение об ошибке (403) с ошибкой.
AccountManager am = new AccountManager(connection);
Map<String, String> attributes = new HashMap<String, String>();
attributes.put("username", "my_user_name");
attributes.put("password", "my_password");
attributes.put("email", "foo@foo.com");
attributes.put("name", "my_full_name");
am.createAccount("my_user_name", "my_password", attributes);
Registration reg = new Registration();
reg.setType(IQ.Type.SET);
reg.setTo(connection.getServiceName());
// attributes.put("username", username);
// attributes.put("password", password);
// reg.setAttributes(attributes);
reg.addAttribute("username", username);
reg.addAttribute("password", password);
reg.addAttribute("email", email);
reg.addAttribute("name", fullName);
PacketFilter filter = new AndFilter(new PacketIDFilter(
reg.getPacketID()), new PacketTypeFilter(IQ.class));
PacketCollector collector = connection.createPacketCollector(filter);
connection.sendPacket(reg);
У кого-нибудь были подобные проблемы или можете подсказать, что я делаю не так?
Спасибо
Вот мой LogCat
10-10 10:00:26.249: DEBUG/StatusBarPolicy(1639): [BRIGHTHY] curNetwork=22003 curHPLMN=22003
10-10 10:00:26.839: INFO/System.out(21277): 10:00:26 AM SENT (1080244736): <iq id="fMJxx-4" to="morena.local" type="get"><query xmlns="jabber:iq:register"></query></iq>
10-10 10:00:26.869: INFO/System.out(21277): 10:00:26 AM RCV (1080244736): <iq from='morena.local' to='admin@morena.local/Smack' id='fMJxx-4' type='result'><query xmlns='jabber:iq:register'><instructions>Choose a username and password to register with this server</instructions><username>admin</username><password/><registered/></query></iq>
10-10 10:00:26.959: INFO/System.out(21277): 10:00:26 AM SENT (1080244736): <iq id="fMJxx-5" to="morena.local" type="set"><query xmlns="jabber:iq:register"><password>new_user</password><username>new_user@morena.local</username></query></iq>
10-10 10:00:26.969: INFO/System.out(21277): 10:00:26 AM RCV (1080244736): <iq from='morena.local' to='admin@morena.local/Smack' id='fMJxx-5' type='error'><query xmlns='jabber:iq:register'><password>new_user</password><username>new_user@morena.local</username></query><error code='403' type='auth'><forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></iq>
10-10 10:00:31.659: WARN/System.err(21277): forbidden(403)
10-10 10:00:31.659: WARN/System.err(21277): at org.jivesoftware.smack.AccountManager.createAccount(AccountManager.java:246)
10-10 10:00:31.659: WARN/System.err(21277): at org.jivesoftware.smack.AccountManager.createAccount(AccountManager.java:207)
10-10 10:00:31.659: WARN/System.err(21277): at org.me.my_project.FriendProfileActivity.connectToServer(FriendProfileActivity.java:698)
10-10 10:00:31.659: WARN/System.err(21277): at org.me.my_project.FriendProfileActivity.connectLogin(FriendProfileActivity.java:578)
10-10 10:00:31.659: WARN/System.err(21277): at org.me.my_project.FriendProfileActivity$2.run(FriendProfileActivity.java:433)
10-10 10:00:31.659: INFO/System.out(21277): 10:00:31 AM SENT (1080244736): <iq id="fMJxx-6" to="morena.local" type="get"><query xmlns="jabber:iq:register"></query></iq>
10-10 10:00:31.679: INFO/System.out(21277): 10:00:31 AM RCV (1080244736): <iq from='morena.local' to='admin@morena.local/Smack' id='fMJxx-6' type='result'><query xmlns='jabber:iq:register'><instructions>Choose a username and password to register with this server</instructions><username>admin</username><password/><registered/></query></iq>
10-10 10:00:31.689: INFO/System.out(21277): 10:00:31 AM SENT (1080244736): <iq id="fMJxx-7" to="morena.local" type="set"><query xmlns="jabber:iq:register"><email>some@some.com</email><password>new_user1</password><username>new_user1@morena.local</username><name>new_user1@MORENA.LOCAL</name></query></iq>
10-10 10:00:31.699: INFO/System.out(21277): 10:00:31 AM RCV (1080244736): <iq from='morena.local' to='admin@morena.local/Smack' id='fMJxx-7' type='error'><query xmlns='jabber:iq:register'><email>some@some.com</email><password>new_user1</password><username>new_user1@morena.local</username><name>new_user1@MORENA.LOCAL</name></query><error code='403' type='auth'><forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></iq>
10-10 10:00:31.729: WARN/System.err(21277): forbidden(403)
10-10 10:00:31.729: WARN/System.err(21277): at org.me.my_project.utilities.CreateChatAccount.createAccount(CreateChatAccount.java:100)
10-10 10:00:31.729: WARN/System.err(21277): at org.me.my_project.utilities.CreateChatAccount.createAccount(CreateChatAccount.java:143)
10-10 10:00:31.729: WARN/System.err(21277): at org.me.my_project.FriendProfileActivity.connectToServer(FriendProfileActivity.java:706)
10-10 10:00:31.729: WARN/System.err(21277): at org.me.my_project.FriendProfileActivity.connectLogin(FriendProfileActivity.java:578)
10-10 10:00:31.729: WARN/System.err(21277): at org.me.my_project.FriendProfileActivity$2.run(FriendProfileActivity.java:433)
7 ответов
Я нашел это! Проблема в конфигурации сервера (но я до сих пор не понимаю, почему я мог зарегистрировать нового пользователя в Pidgin до этого изменения). настройка
%% In-band registration
{access, register, [{allow, all}]}.
похоже, не работает с новыми версиями ejabberd. Вам нужно добавить
{mod_register, [
{access_from, register},
...
] ...
если вы хотите разрешить всем пользователям регистрироваться. Если вы хотите, чтобы только администратор имел такой доступ, то вам нужно добавить новое правило доступа
{access, register_from, [{allow, admin}]}.
а также
{mod_register, [
{access_from, register_from},
...
] ...
У меня работает этот код для регистрации новой учетной записи:
try
{
connection.connect ();
Log.i (TAG, "Connect");
mAccount = new AccountManager (connection);
if (mAccount.supportsAccountCreation ())
{
mAccount.createAccount ("user", "pass");
}
со следующими настройками ejabberd:
{доступ, регистрация, [{разрешить, все}]}.
Это очень безопасная установка, потому что она может записывать без наших аутентифицированных учетных записей на сервере (метод поддерживает.AccountCreation () возвращает нам значение true).
Если бы вы указали ip_access option
в mod_register
? Если Pidgin и ваш сервер ejabberd каким-то образом используют один и тот же IP-адрес, тогда правило по умолчанию выглядит примерно так:
{mod_register, [
...
%%
%% Only clients in the server machine can register accounts
%%
{ip_access, [{allow, "127.0.0.0/8"},
{deny, "0.0.0.0/0"}]},
...
] ...
позволит обоим этим IP-адресам регистрировать учетные записи, но не клиенту Android, который использует другой IP-адрес.
Я столкнулся с проблемой, и по какой-то причине {access_from, register_from}
Решение, которое сработало для вас, не сработало, как ожидалось для меня. Удалось ли вам ограничить возможность создания новых учетных записей только admin
пользователь?
Я столкнулся с той же проблемой и нашел решение:
Внести изменения на сервере
После входа в систему ejabbered от вашего интерфейса администратора. Перейдите в Virtual Host-Nodes-Modules-mod_register и добавьте:
[{welcome_message, {"Welcome!", "Welcome to this Jabber server."}}, {access_from, register}]
Вы сможете успешно создать учетную запись с вашего клиента
Попробуйте внести следующие изменения в ejabberd.cfg.
%%{ip_access, [
%% {allow, "127.0.0.0/8"},
%% {deny, "0.0.0.0/0"}]}
вместе с -
%% In-band registration
{access, register, [{allow, all}]}.
&
{mod_register, [
{access_from, register},
...
]
Я надеюсь, что теперь это будет работать для вас.
Create user everytime
Very easy and work everytime
open ejabberd.cfg file using
sudo nano /etc/ejabberd/ejabberd.cfg
change 600 option to infinity
{registration_timeout, 600}.
{registration_timeout, infinity}.
Зарегистрировать нового пользователя с помощью библиотеки smack после входа в систему через администратор или другую учетную запись.
/ ** * Чтобы зарегистрировать нового клиента на сервере Jabber */
public void registerUser()
{
AccountManager manager = connection.getAccountManager();
try {
manager.createAccount("Romain Guy","halejag");//username & paswd
} catch (XMPPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}