User creation API: ‘active’ attribute を True に設定、レスポンスでは False を返す

皆さん、こんにちは。

Discourse API を使用して Python でユーザーを作成しています。ユーザー作成リクエストは成功応答を返しますが、ペイロードで明示的に true に設定しているにもかかわらず、応答の active 属性が常に false になるという問題が発生しています。confirmed 属性は true に設定されており、これは正常に機能しています。

以下にコードを示します。

import csv
import requests
import json
from datetime import datetime

# Discourse API の詳細
discourse_url = "https://forum.hobiguru.com/"  # Discourse の URL に置き換えてください
api_key = "your-api-key"  # Discourse API キーに置き換えてください
api_username = "system"  # 管理者ユーザー名

# リクエストヘッダー
headers = {
    "Api-Key": api_key,
    "Api-Username": api_username,
    "Content-Type": "application/json"
}

# ユーザーを作成する関数
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,  # デフォルトで active を True に設定
        "confirmed": True,  # デフォルトで confirmed を True に設定
        "created_at": join_date_str
    }

    print(f"\nRequest URL: {url}")
    print(f"Request Headers: {json.dumps(headers, indent=2)}")
    print(f"Request Payload: {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"User creation successful: {json.dumps(response_json, indent=2)}")
        else:
            print(f"User creation failed. Reason: {response_json.get('message')}")
            print(f"Errors: {json.dumps(response_json.get('errors'), indent=2)}")
    else:
        print(f"Request failed: {response.status_code}, {response.text}")

# CSV ファイルからユーザーを読み込む
with open('input_users.csv', mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    for row in reader:
        # 行からユーザー詳細を抽出
        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'))

以下が出力されます。

 Request to create a user

{'name': 'Goran', 'email': 'bla+blaaa@gmail.com', 'password': 'P@ssword!23', 'username': 'goran12', 'active': True, 'confirmed': True, 'created_at': '2024-11-04T10:20:34Z'}
Request URL: https://forum.hobiguru.com/users.json
Request Headers:
{
  "Api-Key": "d9---------------e564d65d9b5a3",
  "Api-Username": "system",
  "Content-Type": "application/json"
}
Request Payload:
{
  "name": "Goran",
  "email": "'bla+blaaa@gmail.com",
  "password": "P@ssword!23",
  "username": "goran12",
  "active": true,
  "confirmed": true,
  "created_at": "2024-11-04T10:20:34Z"
}
Response:

Full Response: {
  "success": true,
  "active": false,
  "message": "Vaš račun je aktiviran i spreman za korištenje."
}
Request was successful and user got created:
{'success': True, 'active': False, 'message': 'Vaš račun je aktiviran i spreman za korištenje.'}

問題点:

  • ペイロードに "active": True を渡しているにもかかわらず、応答の active 属性が常に false になり、Discourse の管理パネルでユーザーを見つけることができません。
  • API は success: true を返しますが、ユーザーは完全にアクティブ化されていないようです。

質問:

  1. active 属性が正しく設定されない原因となる、リクエストで私が何か見落としていることはありますか?
  2. Discourse API には、明示的に true に設定されている場合でも active 属性を上書きする可能性のある特定の条件はありますか?

何か洞察やアドバイスがあれば幸いです!

「いいね!」 2

このスクリプトを一度実行してみてください。役に立つかもしれません。どうぞ:Discourseフォーラム用のダミーユーザーを作成するスクリプト

また、あなたのスクリプトは非常によく機能しているようですが、問題はCSVファイルで使用しているデータにあります。

以下のサンプルデータを使用してあなたのコードをテストしました。

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

私の方では問題なく動作しました。いくつか注意点があります。パスワードは少なくとも12文字以上で、強力なものを使用してください。

試してみて、うまくいくかどうか教えてください :))

@MihirR

ご返信いただき、またご協力いただき、誠にありがとうございます。大変感謝しております。

問題の原因が判明したようです。問題は、私が使用していたメールアドレス、特にダミーユーザー用のプラス記号付きのメールアドレス(例:whatever+something@gmail.comwhatever+something2@gmail.com)にありました。プラス記号なしのメールアドレスを使用すると、すべて正常に機能し、あなたのCSVサンプルと同様にユーザーが作成されます。しかし、プラス記号付きのメールアドレスを使用すると、APIが正しく処理していないようです。

スクリーンショットでは、プラス記号ありとプラス記号なしのメールアドレスを使用した2つのcurl呼び出しを確認できます。

奇妙なのは、プラス記号を使用してもエラーが発生しないことです。 実際には、アカウントが作成およびアクティブ化されたという成功応答を受け取りますが、実際にはそうではありません。Railsコンソールで直接確認し、データベースに接続しましたが、ユーザーは存在しません。Discourse管理画面にも表示されません。

APIの応答に問題があるようです。アカウントが作成およびアクティブ化されたと報告されますが(申し訳ありませんが、スクリーンショットの文字列はクロアチア語です)、ユーザーはシステムにまったく作成されていません。これは、メールアドレスに特殊文字(プラス記号など)が使用されている場合に、APIがユーザー作成を処理または報告する方法に問題がある可能性を示唆しています。

重ねてになりますが、ご協力いただきありがとうございます。この発見が役立つようでしたら、共有させていただきました。

「いいね!」 1

インスタンスで normalize_emails サイト設定はどのように構成されていますか?

「いいね!」 3

実際には、"active": false がその意味であると仮定すると、アクティブ化が機能しなかったことを報告しているようです。

レスポンスのメッセージキーには「Your account is activated and ready for use.」と表示されていますが、これは間違っています。

「いいね!」 1

まさに、それが全体として間違っている部分です。パラメータは active:false となっていますが、メッセージは「アカウントが有効になり、使用可能になりました」となっています。

こんにちは。レスポンスパラメータには active:false と表示されていますが、メッセージには「アカウントが有効化され、使用可能になりました」と表示されています。

確認していませんが、確認します。ここで発表されたようです: Enabling e-mail normalization by default


はい、失敗の原因はフラグ normalize_email:true がデフォルトでtrueになっていたことのようです。これをオフにしたところ、ユーザーが作成されました…しかし、APIは normalize_emails フラグを考慮しておらず、ユーザーが作成もアクティブ化もされていないにもかかわらず、成功イベントを返しています :confused: これをDiscourseのGitHubで報告すべきでしょうか?

「いいね!」 2

それとも Bug rest-api のトピックを開くべきですか :slight_smile:

「いいね!」 1

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