tidbrest · 真实 TiDB Cloud Starter E2E —— 总报告

Postman 风:每条=请求↔响应+耗时+大白话结论。生产模式后端(控制面 :8081 + Data API prod :8080),经 client key→binding→SQL principal→低权用户→真库。密钥已脱敏。报告不入库。
30
用例
18
符合预期
12
偏离/发现
4
面已覆盖
Data·Auth·Admin·SDK

⚠ 真实发现(真链路才暴露)

接口↔用例覆盖核对(代码路由 vs docs/test 用例)
方法:从代码抽真实路由,逐条数 docs/test 里的用例提及。证明 Auth/Data 在"路由+主要行为"层无遗漏(与 Admin 仅真跑 3/234 形成对照)。
Auth API —— 13 路由(92 个唯一 AUTH 用例)全覆盖 · 92 用例
✓ GET /.well-known/jwks.json                 JWKS 公钥                  用例提及:8
✓ POST /v1/signup                            注册                       用例提及:30
✓ POST /v1/token                             登录(password)+刷新(refresh_token) 用例提及:124 · pw 33 / refresh 22
✓ POST /v1/recover                           找回密码                     用例提及:30
✓ POST /v1/update-password                   重置密码(token)              用例提及:12
✓ POST /v1/user/password                     改密(已登录)                  用例提及:9
✓ POST /v1/logout                            登出                       用例提及:18
✓ GET /v1/sessions                           列会话                      用例提及:11
✓ POST /v1/sessions/{id}/revoke              撤销单会话                    用例提及:11
✓ GET /v1/user                               取用户                      用例提及:14
✓ GET /v1/authorize/{provider}               OAuth 发起                 用例提及:10
✓ GET+POST /v1/callback/{provider}           OAuth 回调(GET+POST)       用例提及:12 · POST 11
关键形态均覆盖:PKCE 6 · state/nonce 27 · 限流 28 · 登录锁定 8 · JWT 篡改 2 · 跨项目越权 7 · 撤销全部会话 3。
Public Data API —— 8 路由 + 全部被拒路由(105 个唯一 DATA 用例)全覆盖 · 105 用例
✓ GET /schema                                schema 列表                用例提及:15
✓ GET /schema/{table}                        单表 schema                用例提及:3
✓ GET /doc                                   OpenAPI 文档               用例提及:4
✓ GET /table/{table}                         查询                       用例提及:70
✓ POST /table/{table}                        插入/upsert                用例提及:26 · upsert 29
✓ PATCH /table/{table}                       更新                       用例提及:12
✓ DELETE /table/{table}                      删除                       用例提及:11
✓ 被拒路由 /sql /rpc /ddl /rest/v1 /_proc        非公共 API → 501            用例提及:sql6 rpc4 ddl3 rest/v1 7 _proc4 · 501×19
✓ MethodNotAllowed / DDL schema 变更拒绝         405/501                  用例提及:unsupported×15
高级行为:批量 18 · Range 16 · count 27 · NDJSON 13 · Prefer 19。安全:server-owned 列 16 · 行隔离 22 · 畸形输入 3 · fail-closed 11。Ops 端点(/health /readyz /metrics)见 001 §15 DATA-OPS-*。

✓ 结论

面 A·Data(anon)
GET/schema4036928ms
📋 只暴露 tasks/comments (期望 200)
请求头
apikey: tidbre…<client key>
响应体
{"error":{"code":"policy_denied","message":"policy denied action \"schema.read\" on request","request_id":"claude.sharedgv6CCdD0Jg-000059","status":403,"version":"tidbrest.error.v1"}}
GET/table/tasks?limit=3&order=id.desc20013728ms
📋 读回真实库行 (期望 200)
请求头
apikey: tidbre…<client key>
响应体
{"data":[{"created_at":"2026-06-29T20:56:53Z","id":128,"owner":"qa","priority":124,"status":"todo","title":"bulk-task-124","updated_at":"2026-06-29T20:56:53Z"},{"created_at":"2026-06-29T20:56:53Z","id":127,"owner":"qa","priority":123,"status":"todo","title":"bulk-task-123","updated_at":"2026-06-29T20:56:53Z"},{"created_at":"2026-06-29T20:56:52Z","id":126,"owner":"qa","priority":122,"status":"todo","title":"bulk-task-122","updated_at":"2026-06-29T20:56:52Z"}],"meta":{"count":3,"limit":3,"offset":0}}
GET/table/tasks?status=eq.done&select=id,title,status20010680ms
📋 eq 过滤+select 生效 (期望 200)
请求头
apikey: tidbre…<client key>
响应体
{"data":[{"id":3,"status":"done","title":"Review OpenAPI"}],"meta":{"count":1,"limit":25,"offset":0}}
GET/table/private_notes4034204ms
📋 private_notes 不可见 (期望 403/404)
请求头
apikey: tidbre…<client key>
响应体
{"error":{"code":"table_not_published","message":"table \"private_notes\" is not published","request_id":"claude.sharedgv6CCdD0Jg-000062","status":403,"version":"tidbrest.error.v1"}}
POST/sql5012183ms
📋 /sql 不存在 (期望 404/501)
请求头
Content-Type: application/json
apikey: tidbre…<client key>
请求体
{"q":"select 1"}
响应体
{"error":{"code":"unsupported_operation","message":"raw SQL is not part of the public TiDB Data API","request_id":"claude.sharedgv6CCdD0Jg-000063","status":501,"version":"tidbrest.error.v1"}}
GET/table/tasks?title=eq.x%27%20OR%20%271%27=%27120010320ms
📋 OR '1'='1 当字面值→0 行 (期望 200)
请求头
apikey: tidbre…<client key>
响应体
{"data":[],"meta":{"count":0,"limit":25,"offset":0}}
面 B·Auth
POST/auth/v1/signup2016677ms
📋 新用户+RS256 JWT,落 meta_e2e (期望 200/201)
请求头
Content-Type: application/json
apikey: tidbre…<client key>
请求体
{"project_id":"prj_e2e","environment_id":"env_e2e","email":"e2e+225721@example.com","password":"E2e!pass-225721"}
响应体
{"data":{"access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImUyZS1qd3Qta2V5IiwidHlwIjoiSldUIiwidXNlIjoic2lnIn0.eyJwcm9qZWN0X2lkIjoicHJqX2UyZSIsImVudmlyb25tZW50X2lkIjoiZW52X2UyZSIsInNlc3Npb25faWQiOiJzZXNfNmNiNTUwM2ZmNTAxNmFlN2M0ZjdiYWUzMGNlZGIwMzYiLCJlbWFpbCI6ImUyZSsyMjU3MjFAZXhhbXBsZS5jb20iLCJyb2xlIjoiYXV0aGVudGljYXRlZCIsInNjb3BlcyI6WyJhdXRoZW50aWNhdGVkIl0sInNjb3BlIjoiYXV0aGVudGljYXRlZCIsImlzcyI6InRpZGJyZXN0Oi8vZTJlL3Byb2pBIiwic3ViIjoidXNyXzg2NzIwZjNiZGIwY2FmNDc2NWEyODU2MzBkMGU3ODNlIiwiYXVkIjpbInRpZGJyZXN0LWUyZSJdLCJleHAiOjE3ODI3NzM4OTMsIm5iZiI6MTc4Mjc3MDI5MywiaWF0IjoxNzgyNzcwMjkzfQ.kghf-rq4Is6gQSJ1vc7NbPzEYuzaYWSxOTOz3_tBghxt0mqAA9Upu0rtin08nlc0VinmipO1zoA3pP6SLn-HYo6HVQCjZqKZCLgT6tZmJuh9smD-AEKuKVtZmYFfiMfjuU6oVsYz6zgd7UdnnujpKwQI5WsyDWfRDUwL_bov6_7_JuCw62QvcNrmywwihhft_sbhFdSoS93RhOVkz9I7HZTe9h1WHEYUlQn920ce5Z0OiUZJ2TPG9GyIZNJc-B6eycfoeNBfQgN4gw7fgItic7VWOq-MA9NK0bihbSWtyBshoK4mTDYiimYANKDNXz__LX_UDCQ3e5KY5QoPHEcycg","refresh_token":"QOxATVQY41mTWcCwZg-tEAiKoi66a-z9GD8GDIR0PGA","token_type":"bearer","expires_in":3600,"expires_at":"2026-06-29T22:58:13.125586Z","user":{"id":"usr_86720f3bdb0caf4765a285630d0e783e","project_id":"prj_e2e","environment_id":"env_e2e","email":"e2e+225721@example.com","email_verified_at":null,"phone_verified_at":null,"disabled_at":null,"banned_until":null,"last_sign_in_at":null,"last_password_change_at":"2026-06-29T21:58:10.420506Z","created_at":"2026-06-29T21:58:10.420522Z","updated_at":"2026-06-29T21:58:10.420522Z"},"session":{"id":"ses_6cb5503ff5016ae7
POST/auth/v1/token2007841ms
📋 拿 access+refresh JWT (期望 200)
请求头
Content-Type: application/json
apikey: tidbre…<client key>
请求体
{"grant_type":"password","project_id":"prj_e2e","email":"e2e+225721@example.com","password":"E2e!pass-225721"}
响应体
{"data":{"access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImUyZS1qd3Qta2V5IiwidHlwIjoiSldUIiwidXNlIjoic2lnIn0.eyJwcm9qZWN0X2lkIjoicHJqX2UyZSIsImVudmlyb25tZW50X2lkIjoiZW52X2UyZSIsInNlc3Npb25faWQiOiJzZXNfM2JiMGQ0N2UwMGRhYzJjNDc3Y2RhM2RkOTQ3NTE2Y2IiLCJlbWFpbCI6ImUyZSsyMjU3MjFAZXhhbXBsZS5jb20iLCJyb2xlIjoiYXV0aGVudGljYXRlZCIsInNjb3BlcyI6WyJhdXRoZW50aWNhdGVkIl0sInNjb3BlIjoiYXV0aGVudGljYXRlZCIsImlzcyI6InRpZGJyZXN0Oi8vZTJlL3Byb2pBIiwic3ViIjoidXNyXzg2NzIwZjNiZGIwY2FmNDc2NWEyODU2MzBkMGU3ODNlIiwiYXVkIjpbInRpZGJyZXN0LWUyZSJdLCJleHAiOjE3ODI3NzM5MDAsIm5iZiI6MTc4Mjc3MDMwMCwiaWF0IjoxNzgyNzcwMzAwfQ.eAk1DrSLaf3NG_7oGBojupRqYRRMd3VXadsFf6hXvR1ts0q2Af2kA2NumJNuuaDTr0A97EF1cZF6Af2_qDk49rvTG8KAQy-azRZvuyEvAuydIeCIMldgGFx8W-YXIWuOkmhdD8aOjR5MA8fllGKOK73JNFal2n_XPDSOM5pUMgcqpbshYNDKWBLMMr_CreElKceTW5I7H52wHo3vB4O0_iiJIIlEymDHCIVnVgffoOS_WH-YkAUh5-OUKWiOlFcA8g3mmGsh8kye8CPjhZNY92JdsBWHTF2L5Ku5GykBGamVxRyeFySDVr4U9jJ4R14VbvhphnUiYzB3g3pJXeuAIw","refresh_token":"MELMoqQR-wYblM-8FD9Ttvf0yFYqx1uIsNZKjGMEiOI","token_type":"bearer","expires_in":3600,"expires_at":"2026-06-29T22:58:20.055226Z","user":{"id":"usr_86720f3bdb0caf4765a285630d0e783e","project_id":"prj_e2e","environment_id":"env_e2e","email":"e2e+225721@example.com","email_verified_at":null,"phone_verified_at":null,"disabled_at":null,"banned_until":null,"last_sign_in_at":"2026-06-29T21:58:18.136037Z","last_password_change_at":"2026-06-29T21:58:10.420506Z","created_at":"2026-06-29T21:58:10.420522Z","updated_at":"2026-06-29T21:58:18.136037Z"},"session":{"
GET/auth/v1/user2001784ms
📋 用 JWT 读 /user (期望 200)
请求头
Authorization: Bearer <jwt…redacted>
apikey: tidbre…<client key>
响应体
{"data":{"session":{"id":"ses_3bb0d47e00dac2c477cda3dd947516cb","project_id":"prj_e2e","user_id":"usr_86720f3bdb0caf4765a285630d0e783e","last_refresh_at":"2026-06-29T21:58:20.934623Z","revoked_at":null,"expires_at":"2026-06-30T21:58:19.154145Z","created_at":"2026-06-29T21:58:19.154145Z"},"user":{"id":"usr_86720f3bdb0caf4765a285630d0e783e","project_id":"prj_e2e","environment_id":"env_e2e","email":"e2e+225721@example.com","email_verified_at":null,"phone_verified_at":null,"disabled_at":null,"banned_until":null,"last_sign_in_at":"2026-06-29T21:58:18.136037Z","last_password_change_at":"2026-06-29T21:58:10.420506Z","created_at":"2026-06-29T21:58:10.420522Z","updated_at":"2026-06-29T21:58:18.136037Z"}}}
POST/auth/v1/token2008071ms
📋 换新 access (期望 200)
请求头
Content-Type: application/json
apikey: tidbre…<client key>
请求体
{"grant_type":"refresh_token","project_id":"prj_e2e","refresh_token":"MELMoqQR-wYblM-8FD9Ttvf0yFYqx1uIsNZKjGMEiOI"}
响应体
{"data":{"access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImUyZS1qd3Qta2V5IiwidHlwIjoiSldUIiwidXNlIjoic2lnIn0.eyJwcm9qZWN0X2lkIjoicHJqX2UyZSIsImVudmlyb25tZW50X2lkIjoiZW52X2UyZSIsInNlc3Npb25faWQiOiJzZXNfM2JiMGQ0N2UwMGRhYzJjNDc3Y2RhM2RkOTQ3NTE2Y2IiLCJlbWFpbCI6ImUyZSsyMjU3MjFAZXhhbXBsZS5jb20iLCJyb2xlIjoiYXV0aGVudGljYXRlZCIsInNjb3BlcyI6WyJhdXRoZW50aWNhdGVkIl0sInNjb3BlIjoiYXV0aGVudGljYXRlZCIsImlzcyI6InRpZGJyZXN0Oi8vZTJlL3Byb2pBIiwic3ViIjoidXNyXzg2NzIwZjNiZGIwY2FmNDc2NWEyODU2MzBkMGU3ODNlIiwiYXVkIjpbInRpZGJyZXN0LWUyZSJdLCJleHAiOjE3ODI3NzM5MTIsIm5iZiI6MTc4Mjc3MDMxMiwiaWF0IjoxNzgyNzcwMzEyfQ.uQorGjDS_E-FYvkc_a8685hAnMezqXYNYa6ICrBzkk9Tsoz0HH-TUofR4AdD8QQfDKPeood-XKGhRJrXF5P1y9RoYrarvtTEYIDRWQ29A6CCoZWMZKlh_s3sG6SNCdDx0g1DpppRuCHbJbKnDvPtePvQgCL2jJJIc6zu_BDT67dYS4uwGpqOof1RAwsn855HCFY-9cETlvbuU-XZZ-ZlRul1esIqu8Dhvm9oZAn9N4u1CtX7P3wnEJsHgta8mbDQ0GTxMRrDQNUB5CXXZFmXiPb2rZCWHuk8q7b4vR2KtmOJa4JzH3lTIr-9PkUsI8sokVYKNXIH76bkIAYrDZllFg","refresh_token":"3aIaO_qUKYa82VkbJWwjPhMa-cacRVkuT1havzcstzQ","token_type":"bearer","expires_in":3600,"expires_at":"2026-06-29T22:58:32.597996Z","user":{"id":"usr_86720f3bdb0caf4765a285630d0e783e","project_id":"prj_e2e","environment_id":"env_e2e","email":"e2e+225721@example.com","email_verified_at":null,"phone_verified_at":null,"disabled_at":null,"banned_until":null,"last_sign_in_at":"2026-06-29T21:58:18.136037Z","last_password_change_at":"2026-06-29T21:58:10.420506Z","created_at":"2026-06-29T21:58:10.420522Z","updated_at":"2026-06-29T21:58:18.136037Z"},"session":{"
GET/auth/v1/user4010ms
📋 改尾字节→401,不建立会话 (期望 401)
请求头
Authorization: Bearer <jwt…redacted>
apikey: tidbre…<client key>
响应体
{"error":{"code":"invalid_token","message":"invalid or revoked auth token"}}
POST/auth/v1/token2008086ms
📋 新 access(不被刷新轮换) (期望 200)
请求头
Content-Type: application/json
apikey: tidbre…<client key>
请求体
{"grant_type":"password","project_id":"prj_e2e","email":"e2e+225721@example.com","password":"E2e!pass-225721"}
响应体
{"data":{"access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImUyZS1qd3Qta2V5IiwidHlwIjoiSldUIiwidXNlIjoic2lnIn0.eyJwcm9qZWN0X2lkIjoicHJqX2UyZSIsImVudmlyb25tZW50X2lkIjoiZW52X2UyZSIsInNlc3Npb25faWQiOiJzZXNfMjU5OThhYjhlZTkyNDUwZGRmMGViNjk4NjY0NTcwOTgiLCJlbWFpbCI6ImUyZSsyMjU3MjFAZXhhbXBsZS5jb20iLCJyb2xlIjoiYXV0aGVudGljYXRlZCIsInNjb3BlcyI6WyJhdXRoZW50aWNhdGVkIl0sInNjb3BlIjoiYXV0aGVudGljYXRlZCIsImlzcyI6InRpZGJyZXN0Oi8vZTJlL3Byb2pBIiwic3ViIjoidXNyXzg2NzIwZjNiZGIwY2FmNDc2NWEyODU2MzBkMGU3ODNlIiwiYXVkIjpbInRpZGJyZXN0LWUyZSJdLCJleHAiOjE3ODI3NzM5MTcsIm5iZiI6MTc4Mjc3MDMxNywiaWF0IjoxNzgyNzcwMzE3fQ.qlcTn7k-_QiWD3s7EA_RZw_aMUMQr9PjHQzSOOMEy67ZiGgDd9v0jO9L-Yqq6olmV26d3N-x_kr8b6vxUprbYrmHnb4Fzpg25quRhHtldUCDNQQbqeVwvGmJXpndPQNRAwpKKCawd43wIWQhMPpHUeKWVeIlabzJUNUVxmJ_MDAetrGgigksl-tI8O-Zzo4EIwgsIqubUANqMjMSK83bT612lr-Ml85_amvPgzKNtYt7QIu2dn9F5vMhh_5VlawjXqd0WhjLfhDHg_SfEMp6XyITVTpIpJdWTm20bDVRzQHlpHNBvZBz9JR4j6QVySekeNM5vzXm4os8fpypLoy72Q","refresh_token":"vELnB1fPs0Xz_BFlrQLkxLGbVjOMNuqH4avdWxRv5BQ","token_type":"bearer","expires_in":3600,"expires_at":"2026-06-29T22:58:37.877945Z","user":{"id":"usr_86720f3bdb0caf4765a285630d0e783e","project_id":"prj_e2e","environment_id":"env_e2e","email":"e2e+225721@example.com","email_verified_at":null,"phone_verified_at":null,"disabled_at":null,"banned_until":null,"last_sign_in_at":"2026-06-29T21:58:35.829697Z","last_password_change_at":"2026-06-29T21:58:10.420506Z","created_at":"2026-06-29T21:58:10.420522Z","updated_at":"2026-06-29T21:58:35.829697Z"},"session":{"
POST/auth/v1/logout4017452ms
📋 撤销会话 (期望 200/204)
请求头
Authorization: Bearer <jwt…redacted>
apikey: tidbre…<client key>
响应体
{"error":{"code":"invalid_token","message":"invalid or revoked auth token"}}
面 A·Data(authed)
GET/table/tasks?limit=320013710ms
📋 Bearer+apikey 经 auth_ro→200 (期望 200)
请求头
Authorization: Bearer <jwt…redacted>
apikey: tidbre…<client key>
响应体
{"data":[{"created_at":"2026-06-29T20:54:54Z","id":1,"owner":"qa","priority":1,"status":"todo","title":"Write tests","updated_at":"2026-06-29T20:54:54Z"},{"created_at":"2026-06-29T20:54:54Z","id":2,"owner":"lead","priority":2,"status":"doing","title":"Ship schema endpoint","updated_at":"2026-06-29T20:54:54Z"},{"created_at":"2026-06-29T20:54:54Z","id":3,"owner":"docs","priority":3,"status":"done","title":"Review OpenAPI","updated_at":"2026-06-29T20:54:54Z"}],"meta":{"count":3,"limit":3,"offset":0}}
PATCH/table/tasks?id=eq.150415003ms
📋 A 的修复:过授权;serverless 写可能需重试 (期望 200)
请求头
Authorization: Bearer <jwt…redacted>
Content-Type: application/json
apikey: tidbre…<client key>
请求体
{"status":"doing"}
响应体
{"error":{"code":"db_timeout","message":"update failed: database operation timed out","request_id":"claude.sharedgv6CCdD0Jg-000073","status":504,"version":"tidbrest.error.v1"}}
PATCH/table/tasks?id=eq.150415003ms
📋 A 的修复:过授权;serverless 写可能需重试 (期望 200)
请求头
Authorization: Bearer <jwt…redacted>
Content-Type: application/json
apikey: tidbre…<client key>
请求体
{"status":"doing"}
响应体
{"error":{"code":"db_timeout","message":"update failed: database operation timed out","request_id":"claude.sharedgv6CCdD0Jg-000074","status":504,"version":"tidbrest.error.v1"}}
PATCH/table/tasks?id=eq.150315003ms
📋 A 的修复:过授权;serverless 写可能需重试 (期望 200)
请求头
Authorization: Bearer <jwt…redacted>
Content-Type: application/json
apikey: tidbre…<client key>
请求体
{"status":"doing"}
响应体
{"error":{"code":"metadata_unavailable","message":"registry metadata is unavailable","request_id":"claude.sharedgv6CCdD0Jg-000075","status":503,"version":"tidbrest.error.v1"}}
PATCH/table/tasks?id=eq.150415002ms
📋 A 的修复:过授权;serverless 写可能需重试 (期望 200)
请求头
Authorization: Bearer <jwt…redacted>
Content-Type: application/json
apikey: tidbre…<client key>
请求体
{"status":"doing"}
响应体
{"error":{"code":"db_timeout","message":"update failed: database operation timed out","request_id":"claude.sharedgv6CCdD0Jg-000076","status":504,"version":"tidbrest.error.v1"}}
面 C·Admin
POST/admin/v1/projects/prj_e2e/published-tables4010ms
📋 Bearer 管理令牌打项目写→拒(401/403 皆为拒) (期望 401/403)
请求头
auth: mgmt-bearer
响应体
{"error":{"code":"admin_auth_required","message":"admin authorization is required","status":401,"version":"controlplane.error.v1"}}
GET/admin/v1/projects/prj_e2e00ms
📋 Digest 认证→项目元信息 (期望 200)
请求头
auth: digest
响应体
Get "http://127.0.0.1:8081/admin/v1/projects/prj_e2e": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
GET/admin/v1/projects/prj_e2e/client-keys00ms
📋 Digest 认证→列出项目 client key (期望 200)
请求头
auth: digest
响应体
Get "http://127.0.0.1:8081/admin/v1/projects/prj_e2e/client-keys": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
面 D·SDK(004)
SDKauth.signUp2008207ms
📋 真 @tidbcloud/auth-js 对活后端 (期望 ok)
请求头
sdk: @tidbcloud/auth-js
响应体
{"user": "e2e+sdk-1782783667824-181794@example.com", "hasSession": true}
SDKauth.signInWithPassword20016331ms
📋 真 @tidbcloud/auth-js 对活后端 (期望 ok)
请求头
sdk: @tidbcloud/auth-js
响应体
{"user": "e2e+sdk-1782783667824-181794@example.com", "hasSession": true}
SDKauth.getUser20018142ms
📋 真 @tidbcloud/auth-js 对活后端 (期望 ok)
请求头
sdk: @tidbcloud/auth-js
响应体
{"user": "e2e+sdk-1782783667824-181794@example.com", "id": "<present>"}
SDKdata.select20031447ms
📋 真 @tidbcloud/auth-js 对活后端 (期望 ok)
请求头
sdk: @tidbcloud/auth-js
响应体
{"rowCount": 5, "firstId": 128}
SDKdata.select.eq20042557ms
📋 真 @tidbcloud/auth-js 对活后端 (期望 ok)
请求头
sdk: @tidbcloud/auth-js
响应体
{"rowCount": 3}
SDKdata.insert40347385ms
📋 真 @tidbcloud/auth-js 对活后端 (期望 ok)
请求头
sdk: @tidbcloud/auth-js
响应体
{"code": "policy_denied", "message": "policy denied action \"table.insert\" on table \"tasks\"", "status": 403, "kind": "data_api"}
SDKdata.update50362388ms
📋 真 @tidbcloud/auth-js 对活后端 (期望 ok)
请求头
sdk: @tidbcloud/auth-js
响应体
{"code": "metadata_unavailable", "message": "registry metadata is unavailable", "status": 503, "kind": "data_api"}
SDKdata.delete504109803ms
📋 真 @tidbcloud/auth-js 对活后端 (期望 ok)
请求头
sdk: @tidbcloud/auth-js
响应体
{"code": "db_timeout", "message": "delete failed: database operation timed out", "status": 504, "kind": "data_api"}
SDKauth.signOut401116914ms
📋 真 @tidbcloud/auth-js 对活后端 (期望 ok)
请求头
sdk: @tidbcloud/auth-js
响应体
{"code": "invalid_token", "message": "invalid or revoked auth token", "status": 401, "kind": "auth_api"}
面 C·Admin —— 全量接口覆盖矩阵(234 操作 / 192 路径)
✓=本次已真跑(P0 拒绝 + provision 链路 + 70 个 GET 批量真跑,admin 延迟修复后 ~5s/个) · ○=已枚举未执行(认证 admin 在 serverless 上 ~50-70s/条,全量 95 读不现实;写类多为破坏性)。逐子域:
Onboarding/全局4/5 跑
✓ POST   /admin/v1/bootstrap/admin-api-keys
✓ POST   /admin/v1/onboarding
✓ POST   /admin/v1/projects
○ POST   /admin/v1/users
✓ POST   /v1/bootstrap/admin-api-keys
Org/成员/邀请3/16 跑
✓ GET    /admin/v1/orgs/{org_id}/projects
✓ GET    /v1/orgs/{org_id}/projects
✓ POST   /admin/v1/orgs
○ POST   /admin/v1/orgs/{org_id}/admin-api-keys
○ POST   /admin/v1/orgs/{org_id}/admin-api-keys/{key_id}/revoke
○ POST   /admin/v1/orgs/{org_id}/admin-api-keys/{key_id}/rotate
○ POST   /admin/v1/orgs/{org_id}/admin-oauth/{provider}/exchange
○ POST   /admin/v1/orgs/{org_id}/admin-oauth/{provider}/token
○ POST   /admin/v1/orgs/{org_id}/console-user-invitations
○ POST   /admin/v1/orgs/{org_id}/projects
○ POST   /v1/orgs
○ POST   /v1/orgs/{org_id}/admin-api-keys
○ POST   /v1/orgs/{org_id}/admin-api-keys/{key_id}/revoke
○ POST   /v1/orgs/{org_id}/admin-api-keys/{key_id}/rotate
○ POST   /v1/orgs/{org_id}/console-user-invitations
○ POST   /v1/orgs/{org_id}/projects
项目生命周期2/5 跑
✓ GET    /admin/v1/projects/{project_id}
✓ GET    /admin/v1/projects/{project_id}/readiness
○ POST   /admin/v1/projects/{project_id}/delete
○ POST   /admin/v1/projects/{project_id}/members
○ POST   /admin/v1/projects/{project_id}/suspend
Database Binding3/6 跑
✓ GET    /admin/v1/projects/{project_id}/database-bindings
✓ GET    /admin/v1/projects/{project_id}/database-bindings/{binding_id}
✓ POST   /admin/v1/projects/{project_id}/database-bindings
○ POST   /admin/v1/projects/{project_id}/database-bindings/{binding_id}
○ POST   /admin/v1/projects/{project_id}/database-bindings/{binding_id}/disable
○ POST   /admin/v1/projects/{project_id}/database-bindings/{binding_id}/validate
发布表3/5 跑
✓ GET    /admin/v1/projects/{project_id}/published-tables
✓ GET    /admin/v1/projects/{project_id}/published-tables/{table_id}
✓ POST   /admin/v1/projects/{project_id}/published-tables
○ POST   /admin/v1/projects/{project_id}/published-tables/{table_id}/delete
○ POST   /admin/v1/projects/{project_id}/published-tables/{table_id}/unpublish
Schema 版本/源/漂移5/6 跑
✓ GET    /admin/v1/projects/{project_id}/schema-drift
✓ GET    /admin/v1/projects/{project_id}/schema-graph
○ GET    /admin/v1/projects/{project_id}/schema-source
✓ GET    /admin/v1/projects/{project_id}/schema-versions
✓ GET    /admin/v1/projects/{project_id}/schema-versions/{version_id}
✓ POST   /admin/v1/projects/{project_id}/schema-versions
数据库内省(索引/角色/设置)5/7 跑
✓ GET    /admin/v1/projects/{project_id}/database/indexes
✓ GET    /admin/v1/projects/{project_id}/database/network-restrictions
✓ GET    /admin/v1/projects/{project_id}/database/publications
✓ GET    /admin/v1/projects/{project_id}/database/roles
✓ GET    /admin/v1/projects/{project_id}/database/settings
○ PATCH  /admin/v1/projects/{project_id}/database/settings
○ POST   /admin/v1/projects/{project_id}/database/roles
策略/Grant4/18 跑
○ DELETE /admin/v1/projects/{project_id}/policies/{policy_id}
✓ GET    /admin/v1/projects/{project_id}/grants/summary
✓ GET    /admin/v1/projects/{project_id}/policies
✓ GET    /admin/v1/projects/{project_id}/policies/summary
○ GET    /admin/v1/projects/{project_id}/policies/{policy_id}
○ GET    /admin/v1/projects/{project_id}/policies/{policy_id}/diff
○ GET    /admin/v1/projects/{project_id}/policies/{policy_id}/versions
✓ GET    /admin/v1/projects/{project_id}/policy-templates
○ POST   /admin/v1/projects/{project_id}/grants/preview
○ POST   /admin/v1/projects/{project_id}/grants/reconcile
○ POST   /admin/v1/projects/{project_id}/policies
○ POST   /admin/v1/projects/{project_id}/policies/{policy_id}
○ POST   /admin/v1/projects/{project_id}/policies/{policy_id}/disable
○ POST   /admin/v1/projects/{project_id}/policies/{policy_id}/enable
○ POST   /admin/v1/projects/{project_id}/policies/{policy_id}/rollback
○ POST   /admin/v1/projects/{project_id}/policy-drafts/from-template
○ POST   /admin/v1/projects/{project_id}/policy-drafts/publish
○ POST   /admin/v1/projects/{project_id}/policy-simulations
密钥(admin/client/service)10/30 跑
✓ GET    /admin/v1/projects/{project_id}/admin-api-keys
○ GET    /admin/v1/projects/{project_id}/admin-api-keys/{key_id}
✓ GET    /admin/v1/projects/{project_id}/client-keys
✓ GET    /admin/v1/projects/{project_id}/client-keys/{key_id}
✓ GET    /admin/v1/projects/{project_id}/service-keys
○ GET    /admin/v1/projects/{project_id}/service-keys/{key_id}
✓ GET    /v1/projects/{project_id}/admin-api-keys
○ GET    /v1/projects/{project_id}/admin-api-keys/{key_id}
✓ GET    /v1/projects/{project_id}/client-keys
✓ GET    /v1/projects/{project_id}/client-keys/{key_id}
✓ GET    /v1/projects/{project_id}/service-keys
○ GET    /v1/projects/{project_id}/service-keys/{key_id}
○ POST   /admin/v1/projects/{project_id}/admin-api-keys
○ POST   /admin/v1/projects/{project_id}/admin-api-keys/{key_id}/revoke
○ POST   /admin/v1/projects/{project_id}/admin-api-keys/{key_id}/rotate
✓ POST   /admin/v1/projects/{project_id}/client-keys
○ POST   /admin/v1/projects/{project_id}/client-keys/{key_id}/revoke
○ POST   /admin/v1/projects/{project_id}/client-keys/{key_id}/rotate
✓ POST   /admin/v1/projects/{project_id}/service-keys
○ POST   /admin/v1/projects/{project_id}/service-keys/{key_id}/revoke
○ POST   /admin/v1/projects/{project_id}/service-keys/{key_id}/rotate
○ POST   /v1/projects/{project_id}/admin-api-keys
○ POST   /v1/projects/{project_id}/admin-api-keys/{key_id}/revoke
○ POST   /v1/projects/{project_id}/admin-api-keys/{key_id}/rotate
○ POST   /v1/projects/{project_id}/client-keys
○ POST   /v1/projects/{project_id}/client-keys/{key_id}/revoke
○ POST   /v1/projects/{project_id}/client-keys/{key_id}/rotate
○ POST   /v1/projects/{project_id}/service-keys
○ POST   /v1/projects/{project_id}/service-keys/{key_id}/revoke
○ POST   /v1/projects/{project_id}/service-keys/{key_id}/rotate
Auth 管理(用户/Provider/OAuth/会话)7/32 跑
✓ GET    /admin/v1/projects/{project_id}/auth/oauth-apps
○ GET    /admin/v1/projects/{project_id}/auth/oauth-apps/{client_id}
✓ GET    /admin/v1/projects/{project_id}/auth/oauth-server
✓ GET    /admin/v1/projects/{project_id}/auth/performance/summary
✓ GET    /admin/v1/projects/{project_id}/auth/providers
○ GET    /admin/v1/projects/{project_id}/auth/providers/{provider_id}
✓ GET    /admin/v1/projects/{project_id}/auth/rate-limits
✓ GET    /admin/v1/projects/{project_id}/auth/settings
✓ GET    /admin/v1/projects/{project_id}/auth/users
○ GET    /admin/v1/projects/{project_id}/auth/users/{user_id}
○ GET    /admin/v1/projects/{project_id}/auth/users/{user_id}/identities
○ GET    /admin/v1/projects/{project_id}/auth/users/{user_id}/sessions
○ PATCH  /admin/v1/projects/{project_id}/auth/oauth-apps/{client_id}
○ PATCH  /admin/v1/projects/{project_id}/auth/oauth-server
○ PATCH  /admin/v1/projects/{project_id}/auth/rate-limits
○ PATCH  /admin/v1/projects/{project_id}/auth/settings
○ POST   /admin/v1/projects/{project_id}/auth/oauth-apps
○ POST   /admin/v1/projects/{project_id}/auth/oauth-apps/{client_id}/revoke
○ POST   /admin/v1/projects/{project_id}/auth/oauth-apps/{client_id}/rotate-secret
○ POST   /admin/v1/projects/{project_id}/auth/providers
○ POST   /admin/v1/projects/{project_id}/auth/providers/{provider_id}/disable
○ POST   /admin/v1/projects/{project_id}/auth/providers/{provider_id}/secrets/rotate
○ POST   /admin/v1/projects/{project_id}/auth/providers/{provider_id}/secrets/{secret_id}/revoke
○ POST   /admin/v1/projects/{project_id}/auth/users
○ POST   /admin/v1/projects/{project_id}/auth/users/{user_id}/ban
○ POST   /admin/v1/projects/{project_id}/auth/users/{user_id}/disable
○ POST   /admin/v1/projects/{project_id}/auth/users/{user_id}/enable
○ POST   /admin/v1/projects/{project_id}/auth/users/{user_id}/identities/{identity_id}/unlink
○ POST   /admin/v1/projects/{project_id}/auth/users/{user_id}/password-reset
○ POST   /admin/v1/projects/{project_id}/auth/users/{user_id}/sessions/revoke-all
○ POST   /admin/v1/projects/{project_id}/auth/users/{user_id}/sessions/{session_id}/revoke
○ POST   /admin/v1/projects/{project_id}/auth/users/{user_id}/unban
审计1/1 跑
✓ GET    /admin/v1/projects/{project_id}/audit-events
Me/会话1/3 跑
✓ GET    /admin/v1/me
○ GET    /admin/v1/me/sessions
○ POST   /admin/v1/me/sessions/{session_id}/revoke
其他32/100 跑
○ DELETE /v1/projects/{project_id}/policies/{policy_id}
✓ GET    /admin/v1/openapi.json
✓ GET    /admin/v1/projects/{project_id}/environments
✓ GET    /admin/v1/projects/{project_id}/migration-jobs
○ GET    /admin/v1/projects/{project_id}/migration-jobs/{job_id}
✓ GET    /v1/projects/{project_id}
✓ GET    /v1/projects/{project_id}/audit-events
✓ GET    /v1/projects/{project_id}/auth/oauth-apps
○ GET    /v1/projects/{project_id}/auth/oauth-apps/{client_id}
✓ GET    /v1/projects/{project_id}/auth/oauth-server
✓ GET    /v1/projects/{project_id}/auth/performance/summary
✓ GET    /v1/projects/{project_id}/auth/providers
○ GET    /v1/projects/{project_id}/auth/providers/{provider_id}
✓ GET    /v1/projects/{project_id}/auth/rate-limits
✓ GET    /v1/projects/{project_id}/auth/settings
✓ GET    /v1/projects/{project_id}/auth/users
○ GET    /v1/projects/{project_id}/auth/users/{user_id}
○ GET    /v1/projects/{project_id}/auth/users/{user_id}/identities
○ GET    /v1/projects/{project_id}/auth/users/{user_id}/sessions
✓ GET    /v1/projects/{project_id}/database-bindings
✓ GET    /v1/projects/{project_id}/database-bindings/{binding_id}
✓ GET    /v1/projects/{project_id}/database/indexes
✓ GET    /v1/projects/{project_id}/database/network-restrictions
✓ GET    /v1/projects/{project_id}/database/publications
✓ GET    /v1/projects/{project_id}/database/roles
✓ GET    /v1/projects/{project_id}/database/settings
✓ GET    /v1/projects/{project_id}/environments
✓ GET    /v1/projects/{project_id}/grants/summary
✓ GET    /v1/projects/{project_id}/migration-jobs
○ GET    /v1/projects/{project_id}/migration-jobs/{job_id}
✓ GET    /v1/projects/{project_id}/policies
✓ GET    /v1/projects/{project_id}/policies/summary
○ GET    /v1/projects/{project_id}/policies/{policy_id}
○ GET    /v1/projects/{project_id}/policies/{policy_id}/diff
○ GET    /v1/projects/{project_id}/policies/{policy_id}/versions
✓ GET    /v1/projects/{project_id}/policy-templates
✓ GET    /v1/projects/{project_id}/published-tables
✓ GET    /v1/projects/{project_id}/published-tables/{table_id}
✓ GET    /v1/projects/{project_id}/readiness
✓ GET    /v1/projects/{project_id}/schema-drift
✓ GET    /v1/projects/{project_id}/schema-graph
○ GET    /v1/projects/{project_id}/schema-source
✓ GET    /v1/projects/{project_id}/schema-versions
✓ GET    /v1/projects/{project_id}/schema-versions/{version_id}
○ PATCH  /v1/projects/{project_id}/auth/oauth-apps/{client_id}
○ PATCH  /v1/projects/{project_id}/auth/oauth-server
○ PATCH  /v1/projects/{project_id}/auth/rate-limits
○ PATCH  /v1/projects/{project_id}/auth/settings
○ PATCH  /v1/projects/{project_id}/database/settings
○ POST   /admin/v1/projects/{project_id}/migration-jobs
○ POST   /admin/v1/projects/{project_id}/migration-jobs/{job_id}/apply
○ POST   /admin/v1/projects/{project_id}/migration-jobs/{job_id}/review
○ POST   /admin/v1/projects/{project_id}/migration-jobs/{job_id}/status
○ POST   /admin/v1/projects/{project_id}/registry-refresh
○ POST   /v1/onboarding
○ POST   /v1/projects
○ POST   /v1/projects/{project_id}/auth/oauth-apps
○ POST   /v1/projects/{project_id}/auth/oauth-apps/{client_id}/revoke
○ POST   /v1/projects/{project_id}/auth/oauth-apps/{client_id}/rotate-secret
○ POST   /v1/projects/{project_id}/auth/providers
○ POST   /v1/projects/{project_id}/auth/providers/{provider_id}/disable
○ POST   /v1/projects/{project_id}/auth/providers/{provider_id}/secrets/rotate
○ POST   /v1/projects/{project_id}/auth/providers/{provider_id}/secrets/{secret_id}/revoke
○ POST   /v1/projects/{project_id}/auth/users
○ POST   /v1/projects/{project_id}/auth/users/{user_id}/ban
○ POST   /v1/projects/{project_id}/auth/users/{user_id}/disable
○ POST   /v1/projects/{project_id}/auth/users/{user_id}/enable
○ POST   /v1/projects/{project_id}/auth/users/{user_id}/identities/{identity_id}/unlink
○ POST   /v1/projects/{project_id}/auth/users/{user_id}/password-reset
○ POST   /v1/projects/{project_id}/auth/users/{user_id}/sessions/revoke-all
○ POST   /v1/projects/{project_id}/auth/users/{user_id}/sessions/{session_id}/revoke
○ POST   /v1/projects/{project_id}/auth/users/{user_id}/unban
○ POST   /v1/projects/{project_id}/database-bindings
○ POST   /v1/projects/{project_id}/database-bindings/{binding_id}
○ POST   /v1/projects/{project_id}/database-bindings/{binding_id}/disable
○ POST   /v1/projects/{project_id}/database-bindings/{binding_id}/validate
○ POST   /v1/projects/{project_id}/database/roles
○ POST   /v1/projects/{project_id}/delete
○ POST   /v1/projects/{project_id}/grants/preview
○ POST   /v1/projects/{project_id}/grants/reconcile
○ POST   /v1/projects/{project_id}/members
○ POST   /v1/projects/{project_id}/migration-jobs
○ POST   /v1/projects/{project_id}/migration-jobs/{job_id}/apply
○ POST   /v1/projects/{project_id}/migration-jobs/{job_id}/review
○ POST   /v1/projects/{project_id}/migration-jobs/{job_id}/status
○ POST   /v1/projects/{project_id}/policies
○ POST   /v1/projects/{project_id}/policies/{policy_id}
○ POST   /v1/projects/{project_id}/policies/{policy_id}/disable
○ POST   /v1/projects/{project_id}/policies/{policy_id}/enable
○ POST   /v1/projects/{project_id}/policies/{policy_id}/rollback
○ POST   /v1/projects/{project_id}/policy-drafts/from-template
○ POST   /v1/projects/{project_id}/policy-drafts/publish
○ POST   /v1/projects/{project_id}/policy-simulations
○ POST   /v1/projects/{project_id}/published-tables
○ POST   /v1/projects/{project_id}/published-tables/{table_id}/delete
○ POST   /v1/projects/{project_id}/published-tables/{table_id}/unpublish
○ POST   /v1/projects/{project_id}/registry-refresh
○ POST   /v1/projects/{project_id}/schema-versions
○ POST   /v1/projects/{project_id}/suspend
○ POST   /v1/users