{"record":{"id":"f9f006f00de45b2e","repo":"jeecgboot/JeecgBoot","slug":"error-f9f006","errorCode":null,"errorMessage":"不存在认证信息","messagePattern":"不存在认证信息","errorType":"exception","errorClass":"JeecgBootException","httpStatus":null,"severity":"error","filePath":"jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/filter/ApiAuthFilter.java","lineNumber":223,"sourceCode":"            throw new JeecgBootException(\"timastamp时间戳不合法\");\n        }\n        if (System.currentTimeMillis() - Long.parseLong(timestamp) > 5 * 60 * 1000) {\n            throw new JeecgBootException(\"signature签名已过期(超过五分钟)\");\n        }\n    }\n\n    /**\n     * 认证信息核验\n     * @param appKey\n     * @param signature\n     * @param timestamp\n     * @param openApiAuth\n     * @return\n     * @throws Exception\n     */\n    protected void checkSignature(String appKey, String signature, String timestamp, OpenApiAuth openApiAuth) {\n        if(openApiAuth==null){\n            throw new JeecgBootException(\"不存在认证信息\");\n        }\n\n        if(!appKey.equals(openApiAuth.getAk())){\n            throw new JeecgBootException(\"appkey错误\");\n        }\n\n        if (!signature.equals(md5(appKey + openApiAuth.getSk() + timestamp))) {\n            throw new JeecgBootException(\"signature签名错误\");\n        }\n    }\n\n    protected void checkPermission(OpenApi openApi, OpenApiAuth openApiAuth) {\n        List<OpenApiPermission> permissionList = openApiPermissionService.findByAuthId(openApiAuth.getId());\n\n        boolean hasPermission = false;\n        for (OpenApiPermission permission : permissionList) {\n            if (permission.getApiId().equals(openApi.getId())) {\n                hasPermission = true;","sourceCodeStart":205,"sourceCodeEnd":241,"githubUrl":"https://github.com/jeecgboot/JeecgBoot/blob/96fb33f5ec68516da0b0147da06b2eb0419e063a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/filter/ApiAuthFilter.java#L205-L241","documentation":"Thrown by checkSignature when the OpenApiAuth record looked up for the supplied appKey is null - meaning no credential row exists in the open_api_auth table for that appkey. This fires before the appkey-equality and MD5 checks, so it indicates the appkey itself is unknown to the system.","triggerScenarios":"Caller sends an appkey that was never provisioned, was deleted, or whose record is in a different datasource/tenant; lookup service returned null due to a soft-delete or status filter.","commonSituations":"New partner not yet registered; appkey revoked but client still calling; multi-tenant or microservice mode where the auth table is not replicated to the queried service.","solutions":["Provision an OpenApiAuth row for the appkey in the admin UI / open_api_auth table.","Confirm the appkey has no logical-delete flag and matches exactly (trim whitespace).","In microservice mode, ensure the open_api_auth data is accessible to the service handling the call."],"exampleFix":"// before: appkey='ak_unknown' has no row in open_api_auth\n// after:  INSERT a row with ak='ak_unknown', sk='<secret>' via the admin console","handlingStrategy":"try-catch","validationCode":"// Before relying on an appkey, verify it is provisioned (requires admin API)\nboolean known = openApiAuthAdminService.existsByAk(appkey);\nif (!known) { /* provision or fail fast */ }","typeGuard":null,"tryCatchPattern":"try {\n    openApi.call(...);\n} catch (JeecgBootException e) {\n    if (e.getMessage().contains(\"不存在认证信息\")) {\n        // appkey not registered -> provision it, do not retry with the same value\n    }\n}","preventionTips":["Provision the OpenApiAuth row before distributing the appkey.","Treat a null auth lookup as a provisioning failure, not a transient retry.","In microservice mode, ensure auth data is visible to the serving node."],"tags":["openapi","auth","credentials","signature"],"backgroundTag":null,"analyzedSha":"96fb33f5ec68516da0b0147da06b2eb0419e063a","analyzedAt":"2026-08-14T00:04:16.786Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}