文档中心 / 开发者

错误码

第三方授权 API 返回的全部错误码、对应的 HTTP 状态、含义与建议处理,以及 Swift SDK 的错误映射。

错误格式

所有业务错误都以 JSON 返回:

{ "error": "signature_invalid" }

错误码是稳定的机器可读字符串,请按错误码而不是 HTTP 状态或文案做判断。

注意 少数错误不是 JSON:请求体超过 400,000 字节返回 413;对 POST /api/oauth/clients、POST /api/oauth/authorize、POST /api/oauth/token 这类按固定结构解析的端点,JSON 语法错误、缺少必填字段或缺少 Content-Type: application/json 时,返回框架默认的 400、415 或 422 纯文本响应。签名端点(/api/oauth/requests…、/api/oauth/revoke)的请求体解析失败统一返回 400 invalid_input。

签名与令牌

适用于全部签名调用(/api/oauth/account、/api/oauth/requests…、/api/oauth/vaults…)。

HTTP错误码含义建议处理
401invalid_token缺少 Authorization,或 access token 不存在用 refresh token 续期;仍失败则重新授权
401token_expiredaccess token 已过期(有效期 3600 秒)续期后重试一次
401grant_revoked授权已被用户撤销、被接入方撤销,或因 refresh token 复用整个令牌家族已失效停止重试,清除本地凭据,引导用户重新授权
401client_disabledclient 已被平台运营方停用停止调用;联系平台
403client_disabledclient 已被开发者停用停止调用
401signature_required缺少 x-pm-timestamp、x-pm-nonce 或 x-pm-signature检查签名实现
401signature_invalid时间戳不是整数、nonce 长度不在 8–128、或签名验证失败检查规范串:方法、不含查询串的路径、请求体原始字节的 SHA-256;签名后不要再改动请求体
401timestamp_out_of_window时间戳与服务器相差超过 300 秒校准设备时钟后重试
401nonce_replayed同一授权内 nonce 被重复使用每次请求生成新的随机 nonce

登记 client

POST /api/oauth/clients、DELETE /api/oauth/clients/{id}。

HTTP错误码含义建议处理
400invalid_inputname 为空或超过 100 个字符修正名称
400invalid_client_typeclient_type 不是 public 或 confidential修正类型
400invalid_redirect_uris回调地址数量不在 1–10,或某个地址不符合该类型的规则见回调地址规则
400invalid_public_keyseal_public_key 不是 32 字节 base64url修正公钥
400invalid_platformsplatforms 不是数组、超过 10 项或含非法字符使用小写字母、数字、_、-
400invalid_brandbrand 不是对象,或颜色、图标地址、主页格式不对颜色用 #RRGGBB,图标用 https
400mode_retired提交了非空的 service_public_key(模式 2 已停用)去掉该字段
404client_not_found要停用的 client 不存在、不属于你或已停用—

授权与同意

GET /api/oauth/authorize/info、POST /api/oauth/authorize(由 MimiKey App 调用)。在 MimiKey 中出现这些错误时,接入方通常收到回调 error=invalid_request。

HTTP错误码含义建议处理
404client_not_foundclient_id 不存在核对 client_id
403client_disabledclient 已被开发者或平台停用—
400redirect_uri_mismatch回调地址不在登记列表中使回调地址与登记值逐字一致
400invalid_approval_key审批公钥不是 32 字节检查深链参数 approval_key
400invalid_public_keyseal 公钥不是 32 字节检查深链参数 seal_key
400seal_key_requiredpublic client 未提供 seal 公钥提供 seal_key
400code_challenge_requiredpublic client 未提供 PKCE challenge提供 code_challenge
400invalid_code_challenge方法不是 S256,或 challenge 不是 43–128 个 base64url 字符修正 PKCE
400invalid_policypolicy 不是 ask 或 trust—
400invalid_selections没有选择库、超过 32 个、重复或模式非法—
400mode_retired选择了模式 2只使用模式 1
403vault_not_owned选择了不归该用户所有的库—

令牌

POST /api/oauth/token。

HTTP错误码含义建议处理
400unsupported_grant_typegrant_type 不是 authorization_code 或 refresh_token—
400invalid_clientpublic client 携带了 client_secret去掉 client_secret
401invalid_client_secretclient_id 不存在,或 confidential client 的 secret 不对核对 client_id 与 secret
403client_disabledclient 已停用—
400invalid_code授权码不存在或已被使用重新授权
400code_expired授权码超过 10 分钟重新授权
400code_client_mismatch授权码不属于该 client—
400redirect_uri_mismatchredirect_uri 与授权时不一致—
400invalid_grantPKCE 校验失败或缺少 code_verifier使用生成 challenge 时的同一个 verifier;授权码已作废,需重新授权
401invalid_refresh_tokenrefresh token 缺失、不存在或不属于该 client重新授权
401refresh_expiredrefresh token 超过 30 天未使用重新授权
401refresh_token_reused已轮换作废的 refresh token 被再次提交;该授权的全部令牌已被吊销立即停止自动重试,清除本地凭据,引导用户重新授权;检查是否有并发续期或令牌泄露
401grant_revoked授权已撤销重新授权

撤销

POST /api/oauth/revoke。未知令牌返回 { "ok": true },不报错。

HTTP错误码含义建议处理
400invalid_input请求体不是合法 JSON 或缺少字段—
400invalid_clientpublic client 携带了 client_secret去掉 client_secret,改用签名
401invalid_client_secretclient_id 不存在,或 confidential client 的 secret 不对—
401signature_required 等public client 撤销有效令牌时缺少或带错签名用该授权的审批私钥签名

请求

POST /api/oauth/requests、PUT /api/oauth/requests/{id}/patch、GET /api/oauth/requests/{id}、POST /api/oauth/requests/{id}/cancel。

HTTP错误码含义建议处理
400invalid_input请求体不是合法 JSON、hint 不是对象,或 update_item 创建时携带了 patch_enc修正请求体
400invalid_opop 不是支持的操作—
400item_id_requiredget_item 或 update_item 缺少 item_id—
400unsupported_kindcreate_item 的 kind 不在六种类型之内—
400fields_requiredupdate_item 缺少 fields—
400invalid_fieldsfields 为空、超过 32 个或字段名不合法字段名用小写字母、数字、_,以字母开头
400invalid_patchpatch_enc 缺失、超过 64 KiB 或不是合法的 sealed box检查密封实现
403vault_not_granted目标库不在本授权内(pick_item 跨库时本授权没有任何库)只使用授权返回的库
403mode_not_granted目标库在授权内,但不是该操作需要的模式—
404request_not_found请求不存在或不属于本授权—
409request_not_draft上传补丁时请求已不是草稿:草稿超过 60 秒已过期、补丁已上传,或该请求不是 update_item重新创建 update_item,在 60 秒内上传补丁
409request_not_pending取消时请求已结束以 GET 查询最终状态
429too_many_requests本授权未结束的请求(含草稿)已达 100 个取消不再需要的请求,或等待过期

设备端与用户端

由 MimiKey App 使用,接入方一般不会遇到。

HTTP错误码含义
401locked账号会话不存在或已过期
401device_revoked_or_rotated会话所属设备已被撤销或换密
403untrusted_origin请求的 Origin 与服务地址不符
404grant_not_found授权不存在或不属于当前用户
409request_not_pending处理时请求已结束;或对选条目、新建、修改请求提交了 approve
409request_not_approved上传读取结果时请求尚未批准

运营端

HTTP错误码含义
401admin_locked缺少或无效的管理员会话
400reason_required停用或启用时没有填写原因(1–500 字符)
404client_not_foundclient 不存在

服务器错误

HTTP错误码含义建议处理
500database_error服务端存储暂时不可用指数退避后重试

已停用的错误码

以下错误码属于模式 2,在 v3 中由于 mode_retired 先行拦截,正常情况下不会再出现:service_key_missing、wrap_missing。

回调错误

MimiKey 跳回你的回调地址时可能带有 error 参数:

错误场景建议处理
access_denied用户在同意卡上点了「拒绝」尊重用户的决定
not_signed_inMimiKey 尚未登录账号提示用户先登录 MimiKey
invalid_request深链参数不合法、client 不存在或已停用、回调地址未登记核对 client_id 与回调地址
request_not_found请求不存在或不属于当前 MimiKey 账号检查用户是否登录了授权时的同一个账号

请求类回调还会带 status:completed、denied、cancelled、expired,它们是请求的结果而不是错误,见回调状态汇总。

SDK 错误映射

Swift SDK 把服务器错误码、请求状态与回调统一映射为 MimiKeyError:

MimiKeyError来源
.notInstalled(downloadURL:)无法打开 mimikey://(未安装,或 iOS 未在 LSApplicationQueriesSchemes 中声明 mimikey)
.notAuthorized本机钥匙串中没有授权
.cancelled调用了 cancelPending() 或取消了 Task;请求状态为 cancelled
.denied回调 error=access_denied;请求状态为 denied
.conflict请求状态为 denied 且 deny_reason 为 conflict
.expired请求状态为 expired;超过 expires_at 15 秒仍无结果;授权等待超过 authorizeTimeout;连续 150 次轮询网络失败
.notSignedIn回调 error=not_signed_in
.revokedgrant_revoked、client_disabled、refresh_token_reused、invalid_refresh_token、refresh_expired、invalid_client、invalid_client_secret,以及续期后仍为 invalid_token。SDK 会清空本机凭据
.network(Error)URLSession 失败(等待期间的轮询失败会自动重试)
.protocol(String)其他服务器错误码(如 vault_not_granted、invalid_grant)、其他回调错误(如 invalid_request、request_not_found),以及下表的 SDK 内部错误

token_expired 与 invalid_token 不会直接抛出:SDK 先用 refresh token 续期并重试一次。

SDK 内部的 .protocol 错误码:

错误码含义
nothing_pending调用 retryOpen() 时没有正在等待的流程
invalid_callback授权回调中没有授权码
no_granted_vaultcreateItem 未指定库,且本授权没有可用的库
empty_patchupdateItem 的 patch 为空
updated_item_missing修改完成但服务器没有返回 updated_item
result_missing请求完成但没有 result_enc
result_open_failed无法用本机 seal 私钥打开结果(密钥或 AAD 不匹配)
result_malformed结果明文不是预期的结构
malformed_response服务器响应不是预期的 JSON
http_<状态码>非 2xx 响应且没有 JSON 错误体

最后更新: 2026-10-23