[{"data":1,"prerenderedAt":27},["ShallowReactive",2],{"doc:\u002Fcontracts\u002Foauth\u002F04-tokens-and-errors":3},{"title":4,"route":5,"toc":6,"segments":22,"source":26},"Token 与错误码","\u002Fcontracts\u002Foauth\u002F04-tokens-and-errors",[7,11,13,17,20],{"id":8,"text":9,"depth":10},"jwt-access-token-claims","JWT Access Token Claims",2,{"id":12,"text":12,"depth":10},"错误码速查",{"id":14,"text":15,"depth":16},"oauth-错误-15xxx","OAuth 错误 (15xxx)",3,{"id":18,"text":19,"depth":16},"认证错误-10xxx","认证错误 (10xxx)",{"id":21,"text":21,"depth":16},"通用错误",[23],{"type":24,"html":25},"html","\u003Ch1 id=\"token-与错误码\" tabindex=\"-1\">Token 与错误码\u003C\u002Fh1>\n\u003Cp>返回 \u003Ca href=\"\u002Fcontracts\u002Foauth\">README\u003C\u002Fa>\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"jwt-access-token-claims\" tabindex=\"-1\">JWT Access Token Claims\u003C\u002Fh2>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode class=\"language-json\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">  \"sub\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"用户UUID\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">  \"email\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"邮箱\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">  \"name\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"用户名\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">  \"roles\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">: [\u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"user\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"admin\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">  \"site_id\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">: \u003C\u002Fspan>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">0\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">  \"exp\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">: \u003C\u002Fspan>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">1700000000\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">  \"iat\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">: \u003C\u002Fspan>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">1699999100\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">  \"nbf\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">: \u003C\u002Fspan>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">1699999100\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>签名算法：HS256\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"错误码速查\" tabindex=\"-1\">错误码速查\u003C\u002Fh2>\n\u003Cp>所有错误的响应体格式都是：\u003C\u002Fp>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode class=\"language-json\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">{ \u003C\u002Fspan>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">\"code\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">: \u003C\u002Fspan>\u003Cspan style=\"color:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic\">&#x3C;int>\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">, \u003C\u002Fspan>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">\"message\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"&#x3C;中文消息>\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> }\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>code = 0\u003C\u002Fcode> 表示成功；其余按下面分类查阅。\u003C\u002Fp>\n\u003Ch3 id=\"oauth-错误-15xxx\" tabindex=\"-1\">OAuth 错误 (15xxx)\u003C\u002Fh3>\n\u003Cdiv class=\"kun-table-wrap\">\u003Ctable>\u003Cthead>\n\u003Ctr>\n\u003Cth>Code\u003C\u002Fth>\n\u003Cth>HTTP\u003C\u002Fth>\n\u003Cth>消息\u003C\u002Fth>\n\u003Cth>说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>15001\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>无效的客户端\u003C\u002Ftd>\n\u003Ctd>client_id 不存在\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>15002\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>无效的回调地址\u003C\u002Ftd>\n\u003Ctd>redirect_uri 未注册\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>15003\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>无效的授权码\u003C\u002Ftd>\n\u003Ctd>code 已过期 \u002F 已使用 \u002F 不存在\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>15004\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>无效的代码验证器\u003C\u002Ftd>\n\u003Ctd>PKCE code_verifier 不匹配\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>15005\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>无效的授权类型\u003C\u002Ftd>\n\u003Ctd>client 的 \u003Ccode>grants\u003C\u002Fcode> 列里没有当前 grant_type — \u003Cstrong>常见：admin 创建 client 时漏勾 \u003Ccode>refresh_token\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>15006\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>无效的权限范围\u003C\u002Ftd>\n\u003Ctd>请求的 scope 不在 client 的 \u003Ccode>allowed_scopes\u003C\u002Fcode> 内\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>15007\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>访问被拒绝\u003C\u002Ftd>\n\u003Ctd>用户拒绝授权\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>15008\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>无效的 client secret\u003C\u002Ftd>\n\u003Ctd>confidential client 没传或填错 client_secret\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>15009\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>需要 PKCE\u003C\u002Ftd>\n\u003Ctd>public client 没传 code_verifier\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\u003C\u002Fdiv>\u003Ch3 id=\"认证错误-10xxx\" tabindex=\"-1\">认证错误 (10xxx)\u003C\u002Fh3>\n\u003Cdiv class=\"kun-table-wrap\">\u003Ctable>\u003Cthead>\n\u003Ctr>\n\u003Cth>Code\u003C\u002Fth>\n\u003Cth>HTTP\u003C\u002Fth>\n\u003Cth>消息\u003C\u002Fth>\n\u003Cth>说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>10001\u003C\u002Ftd>\n\u003Ctd>401\u003C\u002Ftd>\n\u003Ctd>未授权\u003C\u002Ftd>\n\u003Ctd>未提供 Bearer Token\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>10002\u003C\u002Ftd>\n\u003Ctd>401\u003C\u002Ftd>\n\u003Ctd>无效的令牌\u003C\u002Ftd>\n\u003Ctd>Token 格式错误 \u002F 签名无效 \u002F \u003Cstrong>refresh 时 client_id 与签发时的不匹配\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>10003\u003C\u002Ftd>\n\u003Ctd>401\u003C\u002Ftd>\n\u003Ctd>令牌已过期\u003C\u002Ftd>\n\u003Ctd>access_token 或 refresh_token 已过期，需要刷新或重新登录\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>10004\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>邮箱或密码错误\u003C\u002Ftd>\n\u003Ctd>登录或 \u003Ccode>PUT \u002Fauth\u002Fpassword\u003C\u002Fcode> 时旧密码不匹配\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>10005\u003C\u002Ftd>\n\u003Ctd>401\u003C\u002Ftd>\n\u003Ctd>用户不存在\u003C\u002Ftd>\n\u003Ctd>UUID 对应的用户不存在（账号被硬删等罕见情况）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>10006\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>该邮箱已被注册\u003C\u002Ftd>\n\u003Ctd>改邮箱 \u002F 注册（send-code 或 register 阶段）时邮箱已存在\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>10007\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>用户名已存在\u003C\u002Ftd>\n\u003Ctd>PATCH \u002Fauth\u002Fme 改 name \u002F 注册时用户名重复\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>10010\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>验证码无效\u003C\u002Ftd>\n\u003Ctd>改邮箱 \u002F 注册时 6 位码错误（或与 send-code 时提交的 email 不一致）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>10011\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>验证码已过期\u003C\u002Ftd>\n\u003Ctd>验证码过期（默认 15 分钟，由 \u003Ccode>KUN_AUTH_VERIFICATION_CODE_TTL_MINUTES\u003C\u002Fcode> 控制）或从未请求；常见来源：用户修改了 email 后没重发码\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>10012\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>邮箱验证码发送过于频繁\u003C\u002Ftd>\n\u003Ctd>上一次 send-code 距今不足限流间隔（改邮箱按 user 限流 \u002F 注册按 email 限流）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>10013\u003C\u002Ftd>\n\u003Ctd>400\u003C\u002Ftd>\n\u003Ctd>新邮箱与当前邮箱相同\u003C\u002Ftd>\n\u003Ctd>改邮箱 send-code 时检测；不消耗验证码额度\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>10014\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>403\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>账号已封禁\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>用户被 admin 封号 — \u003Cstrong>前端应跳错误页（&quot;账号被封禁&quot;）而非登录页\u003C\u002Fstrong>，让用户再登也是同样的 403\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\u003C\u002Fdiv>\u003Ch3 id=\"通用错误\" tabindex=\"-1\">通用错误\u003C\u002Fh3>\n\u003Cdiv class=\"kun-table-wrap\">\u003Ctable>\u003Cthead>\n\u003Ctr>\n\u003Cth>Code\u003C\u002Fth>\n\u003Cth>消息\u003C\u002Fth>\n\u003Cth>触发场景示例\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>1\u003C\u002Ftd>\n\u003Ctd>请求格式错误\u003C\u002Ftd>\n\u003Ctd>JSON 语法错 \u002F multipart 解析失败 \u002F 上游服务（如 image_service）报错\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>7\u003C\u002Ftd>\n\u003Ctd>参数验证失败\u003C\u002Ftd>\n\u003Ctd>字段长度 \u002F 格式校验未通过\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>8\u003C\u002Ftd>\n\u003Ctd>缺少必要参数\u003C\u002Ftd>\n\u003Ctd>必填字段没传（如 multipart 缺 \u003Ccode>file\u003C\u002Fcode>）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>9\u003C\u002Ftd>\n\u003Ctd>参数无效\u003C\u002Ftd>\n\u003Ctd>类型不对 \u002F 超出范围（如 \u003Ccode>ids\u003C\u002Fcode> 个数 &gt;100、\u003Ccode>limit\u003C\u002Fcode> 不是正整数）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>10\u003C\u002Ftd>\n\u003Ctd>操作失败\u003C\u002Ftd>\n\u003Ctd>一般是 DB 写入失败、外部服务异常等内部错误\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\u003C\u002Fdiv>","kun-galgame-infra\u002Fdocs\u002Fintegration\u002Foauth\u002F04-tokens-and-errors.md",1781708341787]