tidbrest · 真实 TiDB Cloud Starter E2E —— 合并报告(Data + Auth)

每条=请求↔响应(Postman 风格)。生产模式后端:控制面 :8081 + Data API prod :8080,经 client key→binding→SQL principal→低权用户→真库。密钥已脱敏。
18
用例
12
符合预期
6
偏离
面 A·Data(anon)
GET/schema4036928ms
📋 只暴露 tasks/comments (期望 200)
请求头
apikey: tidbre…<client key>
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000059
响应体
{"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>
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000060
响应体
{"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>
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000061
响应体
{"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>
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000062
响应体
{"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"}
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000063
响应体
{"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>
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000064
响应体
{"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"}
响应头
X-Request-Id: claude.sharedgv6CCdD0Jg-000065
Content-Type: application/json
响应体
{"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_6cb5503ff5016ae7c4f7bae30cedb036","project_id":"prj_e2e","user_id":"usr_86720f3bdb0caf4765a285630d0e783e","last_refresh_at":"2026-06-29T21:58:14.00749Z","revoked_at":null,"expires_at":"2026-06-30T21:58:11.324302Z","created_at":"2026-06-29T21:58:11.324302Z"}}}
POST/auth/v1/token2007841ms
📋 拿 access+refresh JWT (期望 200)
请求头
apikey: tidbre…<client key>
Content-Type: application/json
请求体
{"grant_type":"password","project_id":"prj_e2e","email":"e2e+225721@example.com","password":"E2e!pass-225721"}
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000066
响应体
{"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":{"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"}}}
GET/auth/v1/user2001784ms
📋 用 JWT 读 /user (期望 200)
请求头
apikey: tidbre…<client key>
Authorization: Bearer <jwt…redacted>
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000067
响应体
{"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"}
响应头
X-Request-Id: claude.sharedgv6CCdD0Jg-000068
Content-Type: application/json
响应体
{"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":{"id":"ses_3bb0d47e00dac2c477cda3dd947516cb","project_id":"prj_e2e","user_id":"usr_86720f3bdb0caf4765a285630d0e783e","last_refresh_at":"2026-06-29T21:58:29.927613Z","revoked_at":null,"expires_at":"2026-06-30T21:58:19.154145Z","created_at":"2026-06-29T21:58:19.154145Z"}}}
GET/auth/v1/user4010ms
📋 改尾字节→401,不建立会话 (期望 401)
请求头
apikey: tidbre…<client key>
Authorization: Bearer <jwt…redacted>
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000069
响应体
{"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"}
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000070
响应体
{"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":{"id":"ses_25998ab8ee92450ddf0eb69866457098","project_id":"prj_e2e","user_id":"usr_86720f3bdb0caf4765a285630d0e783e","last_refresh_at":"2026-06-29T21:58:38.769099Z","revoked_at":null,"expires_at":"2026-06-30T21:58:36.975537Z","created_at":"2026-06-29T21:58:36.975537Z"}}}
POST/auth/v1/logout4017452ms
📋 撤销会话 (期望 200/204)
请求头
apikey: tidbre…<client key>
Authorization: Bearer <jwt…redacted>
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000071
响应体
{"error":{"code":"invalid_token","message":"invalid or revoked auth token"}}
面 A·Data(authed)
GET/table/tasks?limit=320013710ms
📋 Bearer+apikey 经 auth_ro→200 (期望 200)
请求头
apikey: tidbre…<client key>
Authorization: Bearer <jwt…redacted>
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000072
响应体
{"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)
请求头
Content-Type: application/json
apikey: tidbre…<client key>
Authorization: Bearer <jwt…redacted>
请求体
{"status":"doing"}
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000073
响应体
{"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)
请求头
Content-Type: application/json
apikey: tidbre…<client key>
Authorization: Bearer <jwt…redacted>
请求体
{"status":"doing"}
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000074
响应体
{"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)
请求头
Content-Type: application/json
apikey: tidbre…<client key>
Authorization: Bearer <jwt…redacted>
请求体
{"status":"doing"}
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000075
响应体
{"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)
请求头
apikey: tidbre…<client key>
Authorization: Bearer <jwt…redacted>
Content-Type: application/json
请求体
{"status":"doing"}
响应头
Content-Type: application/json
X-Request-Id: claude.sharedgv6CCdD0Jg-000076
响应体
{"error":{"code":"db_timeout","message":"update failed: database operation timed out","request_id":"claude.sharedgv6CCdD0Jg-000076","status":504,"version":"tidbrest.error.v1"}}