Comment enregistrer un nouvel utilisateur sur XMPP en utilisant (a) bibliothèque Smack

StackOverflow https://stackoverflow.com/questions/4476867

  •  11-10-2019
  •  | 
  •  

Question

Je l'ai mis en place un serveur XMPP et le client Android en utilisant le grand poste ... J'ai certains utilisateurs pré définis mis en place dans le serveur XMPP et je pouvais connecter avec ces informations d'identification.

Maintenant, de mon application je veux enregistrer en tant que nouveaux utilisateurs vers le serveur XMPP via le client Android. Quelqu'un peut-il s'il vous plaît me suggérer comment y parvenir ... Toute aide sera appréciée grately ... !!!

Était-ce utile?

La solution 6

Je l'ai résolu en développant un webservice qui prend le nom d'utilisateur et mot de passe en tant que paramètres post. Si nous affichons le nom d'utilisateur et pasword, le webservice enregistre un nouvel utilisateur.

Au lieu de signer de l'application que j'ai trouvé que ce soit assez simple ...

Autres conseils

Smack a une fonctionnalité d'enregistrement InBand qui peut être utilisé via le la classe de AccountManager. Notez que chaque serveur a cette fonction mis en œuvre / activée.

Peut-être que je suis en retard, mais si vous utilisez le dernier smack-android:4.1.0, vous pouvez essayer ci-dessous code pour créer l'objet de XMPPTCPConnectionConfiguration connection et enregistrer un utilisateur:

// Creating a connection
XMPPTCPConnectionConfiguration connConfig =
        XMPPTCPConnectionConfiguration.builder()
                .setHost("myHost.com")  // Name of your Host
                .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                .setPort(5222)          // Your Port for accepting c2s connection
                .setDebuggerEnabled(true)
                .setServiceName("myServiceName")
                .build();
AbstractXMPPConnection connection = new XMPPTCPConnection(connConfig);

try {
    // connecting...
    connection.connect();
    Log.i("TAG", "Connected to " + connection.getHost());

    // Registering the user
    AccountManager accountManager = AccountManager.getInstance(connection);
    accountManager.sensitiveOperationOverInsecureConnection(true);
    accountManager.createAccount(username, password);   // Skipping optional fields like email, first name, last name, etc..
} catch (SmackException | IOException | XMPPException e) {
    Log.e("TAG", e.getMessage());
    xmppClient.setConnection(null);
}

Il suffit d'élaborer sur ce que flux a posté. classe AccountManager a tous les ingrédients pour maintenir les comptes d'utilisateurs dans XMPP

Supposons que vous avez un objet de connexion créé.

AccountManager accountManager=new AccountManager(connection);
try {
    accountManager.createAccount("username", "password");
} catch (XMPPException e1) {
    Log.d(e1.getMessage(), e1);
}

Il est trop tard, mais elle pourra être utile

           XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration
                    .builder();
            config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
            config.setServiceName("nouman.test");
            config.setHost(serverAddress);
            config.setPort(5222);
            config.setDebuggerEnabled(true);
            XMPPTCPConnection.setUseStreamManagementResumptiodDefault(true);
            XMPPTCPConnection.setUseStreamManagementDefault(true);
            config.setSendPresence(true);
            config.setDebuggerEnabled(true);
            config.setSendPresence(true);
            config.setCompressionEnabled(false);
            connection = new XMPPTCPConnection(config.build());
            connection.connect();


 AccountManager accountManager = AccountManager.getInstance(connection);
        Map<String, String> attributes = new HashMap<>();
        attributes.put("name", "full_name");
        attributes.put("email", "email");
        try {
            if (accountManager.supportsAccountCreation()) {
                accountManager.sensitiveOperationOverInsecureConnection(true);
                accountManager.createAccount("username","password", attributes);
                isAccountCreated = true;
            }
        } catch (Exception e) {
            //TODO : Case 409 or Message conflict is the case of username exist handle the case
            LogUtil.printStackTrace(e);
        }

Assurez-vous que vous avez le nom de service correct, sinon vous obtiendrez une mauvaise erreur de demande.

Si vous avez utilisé smack 4.1.0 ou version ci-dessus convertir votre nom d'utilisateur pour LocalPart pour créer un nouveau compte sur le serveur.

 public static void registration(String username,ICallBack iCallBack){

    AccountManager accountManager = AccountManager.getInstance(connection);
    try {
        if(accountManager.supportsAccountCreation()){
            accountManager.sensitiveOperationOverInsecureConnection(true);
            accountManager.createAccount(Localpart.from(username), username);
            iCallBack.onSuccess();
        }
    } catch (SmackException.NoResponseException | XMPPException.XMPPErrorException | SmackException.NotConnectedException e) {
        iCallBack.onFailure(e);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (XmppStringprepException e) {
        e.printStackTrace();
    }

}

Je veux mettre à jour la réponse pour refléter le changement dans la version bibliothèque Asmack 4.0 en avant. Connection.getAccountManager () est maintenant AccountManager.getInstance (XMPPConnection)

AccountManager accountManager=AccountManager.getInstance(connection);
try {
    accountManager.createAccount("username", "password");
} catch (XMPPException e1) {
    Log.d(e1.getMessage(), e1);
}

Vous devez mettre en œuvre dans le client InBand Enregistrement fonctionnalité

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top