跳转至

用户导出 API

用户导出 API 允许开发者将用户批量导出为 CSV 或 ndjson 文件。

导出过程是异步的,也就是说该过程在后台运行。因此,您需要先调用一个端点发起导出任务,然后再调用另一个端点获取该导出任务的状态。

身份验证

如需使用用户导出 API,您的应用必须先使用 Admin API JWT 令牌完成身份验证。

获取有效的 Admin API JWT 后,您可以将其设置为 Bearer Authorization 请求头,用于访问用户导出 API 的各个端点。如果使用的 JWT 无效,API 将返回 "403 Forbidden" 错误。

端点

Run In Postman

用户导出 API 有以下两个端点:

发起导出任务

POST /_api/admin/users/export

使用此端点创建新的用户导出任务。

请求头

Name Value
Content-Type application/json
Authorization Bearer <Admin API JWT Token>
Host <Your Authgear Project domain>

请求体

发起导出端点通过 HTTP(S) 请求体接收 JSON 格式的输入,以下是输入示例:

{
  "format": "csv",
  "csv": {
    "fields": [
      {
        "pointer": "/sub",
        "field_name": "user_id"
      },
      {
        "pointer": "/email"
      }
    ]
  }
}
  • format 字段用于指定导出文件的格式,取值可以是 csv 或 ndjson。
  • csv:当 format 设置为 csv 时使用此字段。其值是一个包含 fields 属性的对象。
  • csv.fields:可以使用此字段列出您想要包含在 CSV 文件中的所有用户属性字段。其值应为数组,数组中的每一项都是一个对象,包含 pointer 属性和可选的 field_name 属性,用于描述一个用户属性。

用户资料属性指针

以下是支持的指针完整列表:

Pointer Description Value
/sub sub 是 "subject"(主体)的缩写,是 OIDC 中的标准字段。其值是 Authany 为该用户生成的唯一 ID String
/preferred_username 用户设置的用户名。 String
/email 与当前用户账号关联的邮箱地址 String
/phone_number 与当前用户账号关联的手机号码 String
/email_verified 一个布尔值,表示用户邮箱当前的验证状态。取值可以是 true 或 false。 Boolean
/phone_number_verified 如果关联的手机号码已验证,返回 true;未验证则返回 false。 Boolean
/name 用户的显示名称。 String
/given_name 用户的名字 String
/middle_name 用户的中间名 String
/nickname 用户设置的昵称。 String
/profile 用户资料的链接 String
/picture 包含用户头像的 URL。 String
/website 用户的网站,即用户在资料中网站属性所设置的值。 String
/gender 保存当前用户设置的性别值(male、female 或其他字符串)。 String
/birthdate 用户在资料的标准属性中设置的生日。 String
/zoneinfo 用户的时区,例如 Asia/Hong_Kong、Europe/London。 String
/locale 用户设置的显示语言,例如英语用 en 表示。 String
/address/street_address 用户在地址标准属性中为街道地址字段设置的值。 String
/address/locality 用户在地址标准属性中为城市(locality)字段设置的值。 String
/address/region 用户在地址标准属性中为"州 / 省 / 地区"字段设置的值。 String
/address/postal_code 用户地址标准属性中的邮政编码。 String
/address/country 用户在地址标准属性中为国家字段设置的值。 String
/roles 分配给当前用户的所有角色列表。 Array
/groups 用户已加入的所有访问管理用户组列表。 Array
/disabled 用户账号的状态。账号未禁用时值为 false,已禁用时值为 true。 Boolean
/identities 与用户账号关联的所有身份的列表。其值的结构如下:[{"claims":{"email":"user@gmail.com"},"login_id":{"key":"email","original_value":"user@gmail.com","type":"email","value":"user@gmail.com"},"type":"login_id"},{"claims":{"phone_number":"+447012341234"},"login_id":{"key":"phone","original_value":"+44712341234","type":"phone","value":"+447012341234"},"type":"login_id"}] Array
/mfa/emails 用户添加的、用于接收双重验证登录链接或 OTP 的邮箱地址列表。 Array
/mfa/phone_numbers 用户添加的、用于通过短信或 WhatsApp 接收 OTP 的手机号码列表。 Array
/mfa/totps 一份 JSON 对象的列表,其中包含 secret 和 uri 等 TOTP 详细信息。以下是该字段数据结构的示例:[ { "secret":"ABCD1234EF...", "uri":"otpauth://totp/user@gmail.com?algorithm=SHA1\u0026digits=6\u0026issuer=https%3A%2F%2F127.0.0.1\u0026period=30\u0026secret=ABCD1234EF..." } ] Array
/biometric_count 用户已注册的生物识别数量。 Integer
/passkey_count 用户已注册的通行密钥数量。 Integer

如果未指定 csv.fields,导出的 CSV 文件将包含上述所有指针作为字段。

自定义属性的 pointer 值遵循以下格式:

{"pointer": "/custom_attributes/CUSTOM_ATTRIBUTE_NAME"}

例如,名为 member_id 的自定义属性对应的值将是 {"pointer": "/custom_attributes/member_id"}。

如果未提供 field_name,则会根据以下规则从 pointer 派生:

  1. 令 parts 为 pointer 中的引用标记(reference token)列表。
  2. 用字符 . 连接 parts。

例如,按照上述规则,{"pointer": "/address/formatted"} 派生出的 field_name 将是 address.formatted。

响应

发起导出端点的 HTTP(S) 请求体如下所示:

{
    "result": {
        "id": "userexport_VWFAACAMB5V0BY1J7KK5NS3GV1TQAACQ",
        "created_at": "2024-10-07T21:06:24.361634372Z",
        "status": "pending",
        "request": {
            "format": "csv",
            "csv": {
                "fields": [
                    {
                        "pointer": "/sub",
                        "field_name": "user_id"
                    },
                    {
                        "pointer": "/email"
                    },
                    {
                        "pointer": "/mfa/emails"
                    }
                ]
            }
        }
    }
}
Forbidden
  • id:该字段的值是检查状态端点所需的导出任务 ID。
  • created_at:包含导出任务的创建日期和时间。
  • status:任务创建成功时返回 pending。

错误响应

Description Name Reason Info
当用户导出功能被禁用时 InternalError UserExportDisabled -
当超出速率限制时 TooManyRequest RateLimited {"bucket_name": "UserExport"}
当已有正在运行的导出任务时 TooManyRequest MaximumConcurrentJobLimitExceeded -
当输入未通过验证时 Invalid ValidationFailed 该信息应包含 JSON schema 验证的输出结果
当字段名称不唯一时 Invalid UserExportNonUniqueFieldNames 输出完整的 "field_names" 列表。例如 {"field_names": ["sub", "a", "b", "a"]}

检查状态

GET /_api/admin/users/export/{Task ID}

使用此端点查询现有导出任务的状态。请将 {Task ID} 替换为发起导出端点响应体中返回的任务 id。

请求头

Name Value
Content-Type application/json
Authorization Bearer <Admin API JWT Token>
Host <Your Authgear Project domain>

响应

以下是检查状态端点响应体的示例:

{
    "result": {
        "id": "userexport_VWFAACAMB5V0BY1J7KK5NS3GV1TQAACQ",
        "created_at": "2024-10-07T21:06:24.361634372Z",
        "completed_at": "2024-10-07T21:06:24.551711713Z",
        "status": "completed",
        "request": {
            "format": "csv",
            "csv": {
                "fields": [
                    {
                        "pointer": "/sub",
                        "field_name": "user_id"
                    },
                    {
                        "pointer": "/email"
                    },
                    {
                        "pointer": "/mfa/emails"
                    }
                ]
            }
        },
        "download_url": "https://storage.googleapis.com/authgear-userexport-staging/example-userexport_userexport_VWFAACAMB5V0BY1J7KK5NS3GV1TQAACQ-20241007210624Z.csv?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=authgear-server%40oursky-kube.iam.gserviceaccount.com%2F20241007%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20241007T210641Z&X-Goog-Expires=59&X-Goog-Signature=abcd12e45&X-Goog-SignedHeaders=host"
    }
}
Forbidden
  • status 字段反映当前导出任务的进度。当值为 completed 时,表示导出已完成,您现在可以下载导出文件。
  • download_url:这是一个签名 URL,可用于下载导出文件。

Note: 已完成的导出任务的结果会在 24 小时后过期。因此,超过 24 小时后,您将无法再使用该任务对应的任务 ID 生成新的下载链接。

错误响应

Description Name Reason Info
当用户导出功能被禁用时 InternalError UserExportDisabled -
当给定的 ID 不对应任何导出任务时 NotFound TaskNotFound -

下载导出文件

检查状态端点的响应中会包含 download_url 字段,该字段是一个签名 URL,您可以打开它下载 CSV 或 ndjson 格式的用户导出文件。

该签名 URL 仅在 60 秒内有效,超时后,您需要使用任务 ID再次请求检查状态端点以获取新的 URL。

使用示例

如需了解如何使用用户导出 API 的详细示例,请参阅以下指南:

使用用户导出 API 导出用户