Настройте сервер XMPP для использования другого JSON API на веб-сервере для хранения и аутентификации пользователей
Мы разрабатываем потребительский аппаратный продукт. Каждое устройство зарегистрировано на центральном веб-сервере, и владелец также имеет учетную запись пользователя, с которой связано устройство. Владелец также может поделиться устройством с другими пользователями.
Теперь, чтобы решить проблему прохождения через брандмауэры и т.д., мы используем XMPP: пользователь получает доступ к своим устройствам с помощью приложения iOS/Android. Приложение подключается к XMPP-серверу, как и аппаратные устройства. Таким образом, приложение может получить доступ к устройствам, отправив пользовательские разделы XMPP.
В настоящее время устройство и мобильное приложение используют один и тот же JID, поэтому устройство будет разрешать сообщения только с того же чистого JID, который использует сам. Чтобы разрешить совместное использование устройств, мы планируем использовать реестр: устройство получит свой собственный JID ("hw381983829@thexmppserver.com") и будет принимать строфы из всех JID в своем списке.
Проблема, с которой я сталкиваюсь, заключается в том, что данные пользователей, устройств и устройств общего доступа хранятся на веб-сервере. Я хотел бы использовать эту же информацию на XMPP-сервере: всем пользователям и устройствам на веб-сервере разрешено входить в XMPP, а список устройств такой же, как у пользователей, которые могут получить к нему доступ. Эта информация может быть доступна через JSON API.
Одним из способов было бы отразить изменения по мере их возникновения, но мне не нравится эта идея, поскольку слишком много шагов могут пойти не так.
Лучшее решение, которое я могу придумать, - позволить серверу XMPP использовать JSON API вместо встроенной базы данных. Это будет только для чтения, но это не проблема, поскольку вся регистрация и обмен должны выполняться на веб-сервере.
Есть идеи, как поступить? Описанная выше функциональность - это более или менее все, что нам нужно: нам не нужны S2S, автономные сообщения и т. Д. В настоящее время мы используем Ejabberd, но Prosody или Openfire, возможно, являются лучшими альтернативами?
1 ответ
Похоже, что для аутентификации этот вклад ejabberd делает именно то, что вам нужно:
https://github.com/processone/ejabberd-contrib/tree/master/ejabberd_auth_http
Для реестра легко написать собственный модуль реестра, который будет работать с вашим HTTP-бэкендом, а не запрашивать базу данных благодаря API ejabberd. Вы можете взглянуть на mod_roster
в качестве руководства для реализации методов: https://github.com/processone/ejabberd/blob/master/src/mod_roster.erl