API de création d'utilisateur : l'attribut 'active' défini sur True mais renvoie False dans la réponse

Salut à tous,

J’utilise Python pour créer des utilisateurs via l’API Discourse. La requête de création d’utilisateur renvoie une réponse de succès, mais je rencontre un problème où l’attribut active dans la réponse est toujours false, même si je l’ai explicitement défini sur true dans la charge utile. L’attribut confirmed est défini sur true, et cela fonctionne bien.

Voici le code :

import csv
import requests
import json
from datetime import datetime

# Détails de l'API Discourse
discourse_url = "https://forum.hobiguru.com/"  # Remplacez par votre URL Discourse
api_key = "your-api-key"  # Remplacez par votre clé API Discourse
api_username = "system"  # Nom d'utilisateur administrateur

# En-têtes de la requête
headers = {
    "Api-Key": api_key,
    "Api-Username": api_username,
    "Content-Type": "application/json"
}

# Fonction pour créer un utilisateur
def create_user(username, name, email, password, bio, location, confirmed, active, join_date):
    url = f"{discourse_url}/users.json"
    join_date_str = join_date.strftime('%Y-%m-%dT%H:%M:%SZ')

    payload = {
        "name": name,
        "email": email,
        "password": password,
        "username": username,
        "active": True,  # Définir active sur True par défaut
        "confirmed": True,  # Définir confirmed sur True par défaut
        "created_at": join_date_str
    }

    print(f"\nURL de la requête : {url}")
    print(f"En-têtes de la requête : {json.dumps(headers, indent=2)}")
    print(f"Charge utile de la requête : {json.dumps(payload, indent=2)}")

    response = requests.post(url, json=payload, headers=headers)
    
    if response.status_code == 200:
        response_json = response.json()
        if response_json.get("success"):
            print(f"Création d'utilisateur réussie : {json.dumps(response_json, indent=2)}")
        else:
            print(f"Échec de la création d'utilisateur. Raison : {response_json.get('message')}")
            print(f"Erreurs : {json.dumps(response_json.get('errors'), indent=2)}")
    else:
        print(f"Échec de la requête : {response.status_code}, {response.text}")

# Lecture des utilisateurs à partir d'un fichier CSV
with open('input_users.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        # Extraire les détails de l'utilisateur de la ligne
        create_user(row['Username'], row['Name'], row['Email'], row['Password'], row['Bio'], row['Location'], row['Confirmed'] == 'TRUE', row['Active'] == 'TRUE', datetime.strptime(row['Join Date'], '%Y-%m-%dT%H:%M:%SZ'))

J’obtiens ceci d’affiché :

 Requête pour créer un utilisateur

{'name': 'Goran', 'email': 'bla+blaaa@gmail.com', 'password': 'P@ssword!23', 'username': 'goran12', 'active': True, 'confirmed': True, 'created_at': '2024-11-04T10:20:34Z'}
URL de la requête : https://forum.hobiguru.com/users.json
En-têtes de la requête :
{
  "Api-Key": "d9---------------e564d65d9b5a3",
  "Api-Username": "system",
  "Content-Type": "application/json"
}
Charge utile de la requête :
{
  "name": "Goran",
  "email": "'bla+blaaa@gmail.com",
  "password": "P@ssword!23",
  "username": "goran12",
  "active": true,
  "confirmed": true,
  "created_at": "2024-11-04T10:20:34Z"
}
Réponse :

Réponse complète : {
  "success": true,
  "active": false,
  "message": "Va\\u0161 ra\\u010dun je aktiviran i spreman za kori\\u0161tenje."
}
La requête a réussi et l'utilisateur a été créé :
{'success': True, 'active': False, 'message': 'Vaš račun je aktiviran i spreman za korištenje.'}

Problème :

  • Malgré le passage de "active": True dans la charge utile, l’attribut active dans la réponse est toujours false et lorsque je recherche les utilisateurs dans le panneau d’administration de Discourse, je n’en trouve aucun.
  • L’API renvoie success: true, mais l’utilisateur ne semble pas être entièrement activé.

Questions :

  1. Y a-t-il quelque chose que j’aurais pu manquer dans ma requête qui pourrait causer le mauvais réglage de l’attribut active ?
  2. Existe-t-il des conditions spécifiques dans l’API de Discourse qui pourraient remplacer l’attribut active, même s’il est explicitement défini sur true ?

Toute idée ou conseil serait grandement apprécié !

2 « J'aime »

Vous pouvez essayer d’exécuter ce script une fois ; cela pourrait vous aider. Voici : Un script pour créer des utilisateurs factices pour votre forum Discourse.

De plus, votre script semble fonctionner assez bien, mais le problème réside dans les données que vous utilisez dans votre fichier CSV.

J’ai testé votre code en utilisant les données d’exemple suivantes :

Username,Name,Email,Password,Bio,Location,Confirmed,Active,Join Date
Paul,Paul Paul,paul@example.com,tough001!@,This is Paul,Australia,TRUE,TRUE,2023-12-30T14:00:00Z
radhika01,Radhika Singh,singhradhika@example.com,tough001!@,This is Radhika Tomar,India,TRUE,TRUE,2023-12-30T14:00:00Z

Cela a parfaitement fonctionné pour moi. Quelques points à garder à l’esprit : utilisez des mots de passe d’au moins 12 caractères et assurez-vous qu’ils sont forts.

Essayez et faites-moi savoir si cela fonctionne pour vous :))

Salut @MihirR

Merci beaucoup pour votre réponse et pour votre aide ! J’apprécie vraiment.

Je pense avoir trouvé le problème. Le problème venait des adresses e-mail que j’utilisais — spécifiquement, les e-mails avec un signe plus (comme les alias Gmail whatever+something@gmail.com, whatever+something2@gmail.com) pour les utilisateurs fictifs. Lorsque j’utilise un e-mail sans le signe plus, tout fonctionne correctement, et l’utilisateur est créé comme dans votre exemple CSV. Cependant, lorsque j’utilise un e-mail avec un signe plus, l’API ne semble pas le gérer correctement.

Dans la capture d’écran, vous pouvez voir 2 appels curl : avec un signe plus et sans signe plus dans l’e-mail…

Le plus étrange est que lorsque j’utilise le signe plus, je n’obtiens pas d’erreur. Je reçois en fait une réponse de succès indiquant que le compte a été créé et activé, mais ce n’est pas vrai. J’ai vérifié directement dans la console Rails et je me suis connecté à la base de données, et l’utilisateur n’est pas là. L’utilisateur n’apparaît pas non plus dans l’administration Discourse.

Il semble y avoir un problème avec la réponse de l’API — elle signale une création et une activation réussies (Désolé, la chaîne de caractères dans la capture d’écran est en croate), mais l’utilisateur n’est jamais réellement créé dans le système. Cela suggère qu’il pourrait y avoir un problème dans la façon dont l’API gère ou signale la création d’utilisateurs lorsque des caractères spéciaux (comme le signe plus) sont utilisés dans l’e-mail.

Encore une fois, merci pour votre aide, et j’ai pensé partager cette découverte avec vous au cas où cela pourrait être utile !

1 « J'aime »

Comment le paramètre du site normalize_emails est-il configuré sur votre instance ?

3 « J'aime »

Il semble qu’il signale en fait que l’activation n’a pas fonctionné, en supposant que c’est ce que signifie « active »: false.

La clé « message » dans la réponse indique « Votre compte est activé et prêt à l’emploi. », ce qui est faux.

1 « J'aime »

Exactement, c’est là que tout se gâte. Le paramètre indique active:false alors que le message dit “Le compte a été activé et est prêt à l’emploi”

Bonjour, le paramètre de réponse indique active:false tandis que le message dit “Le compte a été activé et est prêt à l’emploi”

Je n’ai pas vérifié, mais je vais le faire. Il semble que cela ait été annoncé ici : Enabling e-mail normalization by default


Oui, il semble que la raison de l’échec était le drapeau normalize_email:true, il est vrai par défaut. Comme je l’ai désactivé, les utilisateurs ont été créés… Cependant, l’API ne prend pas en compte le drapeau normalize_emails et renvoie un événement de succès même si l’utilisateur n’a jamais été créé ou activé pour cette question :confused: Dois-je le signaler sur le GitHub de Discourse ?

2 « J'aime »

Ou ouvrir un sujet Bug rest-api :slight_smile:

1 « J'aime »

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.