API de creación de usuarios: el atributo 'active' establecido en True pero devuelve False en la respuesta

Hola a todos,

Estoy usando Python para crear usuarios a través de la API de Discourse. La solicitud de creación de usuario devuelve una respuesta de éxito, pero me encuentro con un problema en el que el atributo active en la respuesta es siempre false, a pesar de que lo establecí explícitamente en true en el payload. El atributo confirmed está establecido en true, y eso funciona bien.

Aquí está el código:

import csv
import requests
import json
from datetime import datetime

# Detalles de la API de Discourse
discourse_url = "https://forum.hobiguru.com/"  # Reemplaza con tu URL de Discourse
api_key = "tu-api-key"  # Reemplaza con tu Clave API de Discourse
api_username = "system"  # Nombre de usuario administrador

# Encabezados de la solicitud
headers = {
    "Api-Key": api_key,
    "Api-Username": api_username,
    "Content-Type": "application/json"
}

# Función para crear un usuario
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,  # Establecer active en True por defecto
        "confirmed": True,  # Establecer confirmed en True por defecto
        "created_at": join_date_str
    }

    print(f"\nURL de la solicitud: {url}")
    print(f"Encabezados de la solicitud: {json.dumps(headers, indent=2)}")
    print(f"Payload de la solicitud: {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"Creación de usuario exitosa: {json.dumps(response_json, indent=2)}")
        else:
            print(f"Creación de usuario fallida. Razón: {response_json.get('message')}")
            print(f"Errores: {json.dumps(response_json.get('errors'), indent=2)}")
    else:
        print(f"Solicitud fallida: {response.status_code}, {response.text}")

# Lectura de usuarios desde un archivo CSV
with open('input_users.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        # Extraer detalles del usuario de la fila
        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'))

Esto es lo que imprimo:

 Solicitud para crear un usuario

{'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 solicitud: https://forum.hobiguru.com/users.json
Encabezados de la solicitud:
{
  "Api-Key": "d9---------------e564d65d9b5a3",
  "Api-Username": "system",
  "Content-Type": "application/json"
}
Payload de la solicitud:
{
  "name": "Goran",
  "email": "'bla+blaaa@gmail.com",
  "password": "P@ssword!23",
  "username": "goran12",
  "active": true,
  "confirmed": true,
  "created_at": "2024-11-04T10:20:34Z"
}
Respuesta:

Respuesta completa: {
  "success": true,
  "active": false,
  "message": "Vaš račun je aktiviran i spreman za korištenje."
}
Solicitud exitosa y el usuario fue creado:
{'success': True, 'active': False, 'message': 'Vaš račun je aktiviran i spreman za korištenje.'}

Problema:

  • A pesar de pasar "active": True en el payload, el atributo active en la respuesta es siempre false y cuando busco a los usuarios en el panel de administración de Discourse, no encuentro ninguno.
  • La API devuelve success: true, pero el usuario no parece estar completamente activado.

Preguntas:

  1. ¿Hay algo que me esté perdiendo en mi solicitud que pueda hacer que el atributo active no se establezca correctamente?
  2. ¿Existen condiciones específicas en la API de Discourse que anulen el atributo active, incluso si está explícitamente establecido en true?

¡Cualquier información o consejo sería muy apreciado!

2 Me gusta

Puedes intentar ejecutar este script una vez; podría ayudarte. Aquí tienes: Un script para crear usuarios ficticios para tu foro de Discourse.

Además, tu script parece funcionar bastante bien, pero el problema radica en los datos que estás utilizando en tu archivo CSV.

Probé tu código utilizando los siguientes datos de ejemplo:

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

Me funcionó perfectamente. Algunas cosas a tener en cuenta: utiliza contraseñas de al menos 12 caracteres de longitud y asegúrate de que sean seguras.

Pruébalo y dime si eso funciona para ti :))

Hola @MihirR

¡Muchas gracias por tu respuesta y por tu ayuda! Lo aprecio mucho.

Creo que he encontrado el problema. El problema estaba con las direcciones de correo electrónico que estaba utilizando, específicamente, correos electrónicos con un signo más (como los alias de Gmail whatever+something@gmail.com, whatever+something2@gmail.com) para usuarios ficticios. Cuando uso un correo electrónico sin el signo más, todo funciona bien y el usuario se crea como en tu muestra CSV. Sin embargo, al usar un correo electrónico con un signo más, la API no parece manejarlo correctamente.

En la captura de pantalla puedes ver 2 llamadas curl: con un signo más y sin un signo más en el correo electrónico…

Lo extraño es que cuando uso el signo más, no obtengo un error. De hecho, recibo una respuesta de éxito que dice que la cuenta ha sido creada y activada, pero esto no es cierto. Verifiqué directamente en la consola de Rails y me conecté a la base de datos, y el usuario no está allí. El usuario tampoco aparece en la administración de Discourse.

Parece que hay un problema con la respuesta de la API: informa una creación y activación exitosas (Lo siento, la cadena en la captura de pantalla está en croata), pero el usuario nunca se crea realmente en el sistema. Esto sugiere que podría haber un problema con la forma en que la API maneja o informa sobre la creación de usuarios cuando se utilizan caracteres especiales (como el signo más) en el correo electrónico.

Nuevamente, gracias por tu ayuda, ¡y pensé en compartir este descubrimiento contigo en caso de que sirva de algo!

1 me gusta

¿Cómo está configurado el ajuste del sitio normalize_emails en tu instancia?

3 Me gusta

Parece que en realidad informa que la activación no funcionó, asumiendo que eso es lo que significa "active": false.

La clave del mensaje en la respuesta dice “Tu cuenta está activada y lista para usar”, lo cual es incorrecto.

1 me gusta

Exacto, esa es la parte incorrecta en todo. El parámetro dice active:false mientras que el mensaje dice “La cuenta ha sido activada y está lista para usarse”

Hola, el parámetro de respuesta dice active:false mientras que el mensaje dice “La cuenta ha sido activada y está lista para usarse”

No lo he comprobado, pero lo haré. Parece que se anunció aquí: Enabling e-mail normalization by default


Sí, parece que el motivo del fallo fue la bandera normalize_email:true, que es verdadera por defecto. Al desactivarla, los usuarios se crearon… Sin embargo, la API no está considerando la bandera normalize_emails y está devolviendo un evento de éxito, aunque el usuario nunca se creó ni se activó, para el caso:confused: ¿Debería informar de esto en el GitHub de Discourse?

2 Me gusta

O abrir un tema de Bug rest-api :slight_smile:

1 me gusta

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