Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

users.list(include_totals=False) raises ParsingError on a successful 200 response

オープン
#856 コメント 4 件 リアクション 1 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
3/5
見積もり時間
1〜2日
初心者へのやさしさ
68/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
静か
技術スタック
python
領域
api

調査の方向性

src/auth0/management/users/raw_client.py の RawUsersClient.list から始め、ListUsersOffsetPaginatedResponseContent と、提供されている include_totals=False の再現を調べます。成功した array レスポンスが受け付けられること、および include_totals=True の動作と同様に、SyncPager が UserResponseSchema の項目を生成することを確認します。

索引モデルが issue の本文から書いたものです。

説明

bug
Checklist
  • I have looked into the Readme and have not found a suitable solution or answer.
  • I have looked into the API documentation and have not found a suitable solution or answer.
  • I have searched the issues and have not found a suitable solution or answer.
  • I have searched the Auth0 Community forums and have not found a suitable solution or answer.
  • I agree to the terms within the Auth0 Code of Conduct.
Description

ManagementClient.users.list(..., include_totals=False, ...) raises auth0.management.core.parse_error.ParsingError (wrapping a Pydantic ValidationError) on a successful HTTP 200 response from the Management API.

The SDK unconditionally validates the response body against ListUsersOffsetPaginatedResponseContent, which is a dict-shaped Pydantic model. But the Management API — per its public documentation and per the SDK's own docstring — returns a bare JSON array when include_totals=false. The two shapes are incompatible, and there is no branch in the SDK to handle the array case.

Observed

ParsingError: headers: {...}, status_code: 200, body: [{'user_id': 'auth0|...'}], cause: 1 validation error for ListUsersOffsetPaginatedResponseContent
  Input should be a valid dictionary or instance of ListUsersOffsetPaginatedResponseContent [type=model_type, input_value=[{'user_id': 'auth0|...'}], input_type=list]
    For further information visit https://errors.pydantic.dev/2.12/v/model_type

Note the status_code: 200 and the body: [...] (a JSON array). The API responded successfully and in the documented shape; the SDK then failed to parse the response.

Expected

The SyncPager yields UserResponseSchema items, equivalent to the behavior when include_totals=True.

Reproduction
from auth0.management import ManagementClient

client = ManagementClient(domain=..., token=...)

list(client.users.list(
    q='username:"someuser"',
    include_totals=False,
    fields="user_id",
))
Additional context

Root cause

In src/auth0/management/users/raw_client.py, RawUsersClient.list has a single success branch:

https://github.com/auth0/auth0-python/blob/d381cbfa5045ee631ab9eaa458f3dd67d2383b57/src/auth0/management/users/raw_client.py#L135-L143

There is no if include_totals: branch, and the Pydantic model itself is dict-only:

https://github.com/auth0/auth0-python/blob/d381cbfa5045ee631ab9eaa458f3dd67d2383b57/src/auth0/management/types/list_users_offset_paginated_response_content.py#L10-L15

There is no RootModel/list-validation fallback, so parse_obj_as cannot accept the array shape that the API returns.

Contradiction between the SDK's parameter default and the API's contract

The SDK signature:

include_totals: typing.Optional[bool] = True,

…but the SDK's own docstring (copied from the API spec) reads:

Return results inside an object that contains the total result count (true) or as a direct array of results (false, default).

And the public Management API documentation at https://auth0.com/docs/api/management/v2/users/get-users agrees: include_totals=false returns "a direct array of results."

So the API's default behavior (false) is exactly the case the SDK parser cannot handle. This very likely masked the bug in CI — the SDK's own default value (True) takes the only branch the parser supports.

Evidence that the error originates inside the SDK, not from the API

The Auth0 API returned HTTP 200 with the documented response shape. The ParsingError.__str__ formatter in src/auth0/management/core/parse_error.py produces exactly the wire format we see:

def __str__(self) -> str:
    cause_str = f", cause: {self.cause}" if self.cause is not None else ""
    return f"headers: {self.headers}, status_code: {self.status_code}, body: {self.body}{cause_str}"

The cause is a Pydantic ValidationError against ListUsersOffsetPaginatedResponseContent — i.e., the SDK choking on a valid response.

auth0-python version

5.4.0

Python version

3.10

主要言語
Python
スター
581
フォーク
189
平均マージ
15時間 33分
マージ済み PR(30日)
6

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

auth0/auth0-python のほかの issue

auth0/auth0-python の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。