API creazione utente: attributo ‘active’ impostato su True ma ritorna False nella risposta

Ciao a tutti,

Sto usando Python per creare utenti tramite l’API di Discourse. La richiesta di creazione utente restituisce una risposta di successo, ma sto riscontrando un problema in cui l’attributo active nella risposta è sempre false, anche se l’ho esplicitamente impostato su true nel payload. L’attributo confirmed è impostato su true e funziona correttamente.

Ecco il codice:

import csv
import requests
import json
from datetime import datetime

# Dettagli API di Discourse
discourse_url = "https://forum.hobiguru.com/"  # Sostituisci con il tuo URL di Discourse
api_key = "your-api-key"  # Sostituisci con la tua chiave API di Discourse
api_username = "system"  # Nome utente amministratore

# Intestazioni della richiesta
headers = {
    "Api-Key": api_key,
    "Api-Username": api_username,
    "Content-Type": "application/json"
}

# Funzione per creare un utente
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,  # Imposta active su True per impostazione predefinita
        "confirmed": True,  # Imposta confirmed su True per impostazione predefinita
        "created_at": join_date_str
    }

    print(f"\nURL della richiesta: {url}")
    print(f"Intestazioni della richiesta: {json.dumps(headers, indent=2)}")
    print(f"Payload della richiesta: {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"Creazione utente riuscita: {json.dumps(response_json, indent=2)}")
        else:
            print(f"Creazione utente fallita. Motivo: {response_json.get('message')}")
            print(f"Errori: {json.dumps(response_json.get('errors'), indent=2)}")
    else:
        print(f"Richiesta fallita: {response.status_code}, {response.text}")

# Lettura degli utenti da un file CSV
with open('input_users.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        # Estrai i dettagli dell'utente dalla riga
        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'))

Ottengo questo stampato:

 Richiesta di creazione di un utente

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

Risposta completa: {
  "success": true,
  "active": false,
  "message": "Vaš račun je aktiviran i spreman za korištenje."
}
Richiesta riuscita e utente creato:
{'success': True, 'active': False, 'message': 'Vaš račun je aktiviran i spreman za korištenje.'}

Problema:

  • Nonostante l’invio di "active": True nel payload, l’attributo active nella risposta è sempre false e quando cerco gli utenti nel pannello di amministrazione di Discourse non ne trovo nessuno.
  • L’API restituisce success: true, ma l’utente non sembra essere completamente attivato.

Domande:

  1. C’è qualcosa che potrei trascurare nella mia richiesta che potrebbe causare il mancato corretto impostazione dell’attributo active?
  2. Ci sono condizioni specifiche nell’API di Discourse che potrebbero sovrascrivere l’attributo active, anche se è esplicitamente impostato su true?

Qualsiasi intuizione o consiglio sarebbe molto apprezzato!

2 Mi Piace

Puoi provare a eseguire questo script una volta; potrebbe esserti d’aiuto. Eccolo: Uno script per creare utenti fittizi per il tuo forum Discourse.

Inoltre, il tuo script sembra funzionare abbastanza bene, ma il problema risiede nei dati che stai utilizzando nel tuo file CSV.

Ho testato il tuo codice utilizzando i seguenti dati di esempio:

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

Per me ha funzionato perfettamente. Alcune cose da tenere a mente: usa password lunghe almeno 12 caratteri e assicurati che siano robuste.

Provalo e fammi sapere se funziona per te :))

Ciao @MihirR

Grazie mille per la tua risposta e per il tuo aiuto! Lo apprezzo molto.

Penso di aver trovato il problema. Il problema riguardava gli indirizzi email che stavo usando, in particolare le email con un segno più (come gli alias di Gmail whatever+something@gmail.com, whatever+something2@gmail.com) per gli utenti fittizi. Quando uso un’email senza il segno più, tutto funziona correttamente e l’utente viene creato come nel tuo esempio CSV. Tuttavia, quando uso un’email con un segno più, l’API non sembra gestirla correttamente.

Nello screenshot puoi vedere 2 chiamate curl: una con il segno più e una senza il segno più nell’email…

La cosa strana è che quando uso il segno più, non ricevo un errore. Ricevo effettivamente una risposta di successo che indica che l’account è stato creato e attivato, ma non è vero. Ho controllato direttamente nella console Rails e mi sono connesso al database, ma l’utente non c’è. L’utente non compare nemmeno nell’amministrazione di Discourse.

Sembra esserci un problema con la risposta dell’API: segnala una creazione e attivazione riuscite (Scusa, la stringa nello screenshot è in croato), ma l’utente non viene mai effettivamente creato nel sistema. Ciò suggerisce che potrebbe esserci un problema con il modo in cui l’API gestisce o segnala la creazione dell’utente quando vengono utilizzati caratteri speciali (come il segno più) nell’email.

Ancora una volta, grazie per il tuo aiuto, e ho pensato di condividere questa scoperta con te nel caso in cui possa essere utile!

1 Mi Piace

Come è configurata l’impostazione del sito normalize_emails nella tua istanza?

3 Mi Piace

Sembra che in realtà riporti che l’attivazione non ha funzionato, supponendo che sia questo ciò che significa "active": false.

La chiave del messaggio nella risposta dice “Il tuo account è attivato e pronto per l’uso.”, il che è sbagliato.

1 Mi Piace

Esatto, quella è la parte sbagliata in tutto questo. Il parametro dice active:false mentre il messaggio dice “Account activated and ready for use”

Ciao, il parametro response dice active:false mentre il messaggio dice “Account attivato e pronto per l’uso”

Non ho controllato, ma lo farò. Sembra che sia stato annunciato qui: Enabling e-mail normalization by default


Sì, sembra che il motivo del fallimento sia stato il flag normalize_email:true, che è vero per impostazione predefinita. Dato che l’ho disattivato, gli utenti sono stati creati… Tuttavia, l’API non sta considerando il flag normalize_emails e sta restituendo un evento di successo anche se l’utente non è mai stato creato o attivato peraltro :confused: Dovrei segnalarlo su discourse github?

2 Mi Piace

Oppure aprire un argomento Bug rest-api :slight_smile:

1 Mi Piace

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