
后端网络/通信云原生【免费下载链接】bfeA modern layer 7 load balancer from baidu项目地址https://gitcode.com/gh_mirrors/bf/bfe点击查看免费下载mod_ai_token_auth 是 BFE百度开源的七层负载均衡器中专门面向 LLM大语言模型服务的鉴权模块它按规则校验请求头中携带的 API-Keytoken并结合模型白名单/黑名单、来源 IP 子网与 Redis 中的配额余额决定请求是否被允许访问后端 LLM 服务。阅读本文后你将掌握该模块的完整认证流程、mod_ai_token_auth.conf基础配置与token_rule.data规则配置的全部字段含义并了解配额token 数与 RMB 两种计量单位在请求完成后如何从响应体中提取用量并完成扣减的底层实现。模块概览mod_ai_token_auth 为 LLM 服务提供基于 API-Keytoken的认证能力。一个 API-Key 代表一个拥有特定 LLM 服务访问权限和配额额度的凭证。模块按照规则检查请求中携带的 API-Key以判断该请求是否被允许访问 LLM 服务。请求通过请求头携带 API-Key格式为标准的 Bearer TokenAuthorization: Bearer api-key从源码结构看该模块位于bfe_modules/mod_ai_token_auth/目录由模块入口 mod_ai_token_auth.go、基础配置解析 conf_mod_ai_token_auth.go、规则加载 token_rule_load.go、规则表 token_rule_table.go、Token/配额模型 token.go 与模型权限校验 model_check.go 等文件共同组成仓库内置了与之配套的 mod_ai_token_auth_test.go、token_rule_table_test.go 等测试用例。Token 认证流程模块的工作原理由以下六个步骤构成请求入口Request Entry请求到达后模块检查其是否匹配认证规则Token 校验Token Validation从请求的Authorization头中提取 API-Key并校验其有效性状态、过期时间等模型权限检查Model Permission Check校验请求的模型是否在允许列表中且不在黑名单中IP 子网检查IP Subnet Check校验请求来源 IP 是否在允许的子网范围内配额检查Quota Check检查关联的配额计划quota plans是否仍有足够余额配额扣减Quota Deduction请求完成后从响应体中提取 token 用量并扣减对应配额。规则匹配与请求入口模块初始化时Init向 BFE 回调链注册了四个过滤点HandleFoundProduct→tokenFoundProductHandler在产品product确定后执行规则匹配与 Token 认证HandleAfterAITargetModel→targetModelCheckFilter在目标模型解析完成后执行模型允许/禁止校验HandleReadResponse→tokenReadResponseHandler读取响应非流式场景并提取用量HandleRequestFinish→tokenRequestFinishHandler请求结束时执行配额扣减。规则匹配由matchTokenRule完成mod_ai_token_auth.go先按req.Route.Product产品线在规则表中查找规则列表再逐个规则调用rule.Cond.Match(req)进行条件匹配未命中任何规则时请求直接放行。规则中的cond使用 BFE 的条件表达式语法编写语法细节参见 condition_grammar.md。Token 有效性校验规则命中后tokenFoundProductHandler调用ValidateUserTokenByReqtoken_rule_table.go完成认证。校验顺序与对应错误码如下校验项失败时的错误码bfe_basic常量说明请求头缺失 API-KeyCodeNoApiKey返回no api key in request产品线为空CodeInvalidRequest返回product not foundKey 在表中不存在CodeInvalidApiKey返回Invalid API key: ... Key not found in system.Token 被禁用CodeKeyDisabled返回Invalid API key: ... disabled.Token 过期expired_time ! -1且早于当前时间CodeKeyExpired返回Invalid API key: ... expired.配额计划过期CodeQuotaExpired返回Quota plan ... expired.配额查询内部错误如 Redis 异常CodeInternalQuotaError返回Internal error during quota deduction ...配额耗尽HasBalance为 falseCodeQuotaExhausted返回Quota plan ... exhausted.对应 HTTP 429来源 IP 不在允许子网CodeSubnetNotAllowed返回Client IP not in subnet of key ...其中Key 在表中不存在会通过SetAiAuthInfo将拒绝原因写入AiBasicInfo并尽早记录ClientKeyId保证即使请求被拒绝访问日志仍能标识出对应的 Token。HasBalancetoken.go对不限量Unlimited计划直接返回 true否则读取 Redis keyKeyNotFound视为无余额而不是内部错误。模型权限校验早期版本中模型校验在认证阶段完成当前版本已将模型 allow/block 校验移动到转发阶段HandleAfterAITargetModel由ValidateTargetModelmodel_check.go执行此时目标模型已完成路由目标覆盖、集群前缀剥离和集群模型映射等全部解析校验的是真正转发给后端的最终模型名。校验逻辑为先检查黑名单block_models命中即返回CodeModelNotAllowedModel ... blocked by key ...再检查白名单allow_models配置了白名单但模型不在其中时同样返回CodeModelNotAllowedModel ... not allowed by key ...。未配置任何 allow/block 列表的 Token 以及未命中 Token 规则的请求直接放行。该过滤点注册在 mod_ai_rate_limit 之前确保 allow/block 校验总是先于限流执行。配额扣减请求完成后模块根据响应状态与内容执行用量提取与扣减非流式响应tokenReadResponseHandlermod_ai_token_auth.go在200 OK且ContentLength 0时标记响应完成读取完整响应体并调用UpdateCtxByUsage提取用量若提取到的UsedQuota为 0 且允许估算则以ContentLength / 4估算 completion tokens 并计算用量。用量提取UpdateCtxByUsagemod_ai_token_auth.go按请求识别出的协议/鉴权风格modelprotocol.Get(authStyle)调用ExtractUsageFields解析响应体若单协议适配器未解析出任何用量字段例如 Bearer 风格识别为 openai 而后端返回 Anthropic 响应体会回退到跨协议组合解析ParseUsageFieldsCrossProtocol避免UsedQuota恒为 0 导致用量丢失。解析结果覆盖 prompt/completion tokens、cache read/write tokens、audio tokens、image input tokens 以及 image/video count 等字段。请求结束扣减tokenRequestFinishHandlermod_ai_token_auth.go跳过/count_tokens计数类接口只对200 OK请求计费通过ctx.deducted标志防止HandleRequestFinish重复触发导致重复扣减客户端在最终用量出现前中止RST/close/write-fail的请求按设计不按全量估算计费。若 Token 关联了 RMB 配额计划还会基于集群模型价格表cluster_conf.LookupModelPrice与用量计算费用calcCostUnits按 Chat/Image/Video/Responses 模式分别计算价格查不到时按 0 计费并累加PriceLookupMiss计数作为价格表配置错误的监控信号。扣减最终落到QuotaPlan.Deducttoken.go通过 Redis Lua 脚本原子执行token 类配额对 Redis key 执行GETDECRBY扣减不超过当前余额RMB 类配额在 key 不存在时先以计划总额SET初始化再扣减返回扣减后的剩余值。监控指标模块通过web_monitor注册了mod_ai_token_auth与mod_ai_token_auth.diff两个监控接口源码见 mod_ai_token_auth.go核心指标如下指标名类型说明REQ_TOTALCounter请求总数REQ_AUTHCounter触发认证的请求数REQ_AUTH_FAILCounter认证失败的请求数此外源码中还定义了PriceLookupMiss计数器统计计费时在集群模型价格表中未查到价格未知集群/模型/模式的次数用于监控价格表配置错误mod_ai_token_auth.go。基础配置mod_ai_token_auth.confmod_ai_token_auth.conf是模块的基础配置文件用于指定 API-Key 规则配置文件路径、Redis 连接信息以及调试日志开关。完整字段说明参见 mod_ai_token_auth.conf.md。配置项说明配置项类型含义是否必填补充说明生效条件Basic.ProductRulePathStringAPI-Key 声明与规则配置文件路径N默认值为mod_ai_token_auth/token_rule.data类型为 FilePath文件必须存在且可读Redis.BnsStringRedis 服务的 BNS 名称YRedis 用于存储 API-Key 配额用量必须是有效的 Redis 服务地址Redis.ConnectTimeoutInteger连接超时毫秒Y-必须大于 0Redis.ReadTimeoutInteger读超时毫秒Y-必须大于 0Redis.WriteTimeoutInteger写超时毫秒Y-必须大于 0Redis.MaxIdleInteger最大空闲连接数Y-必须大于等于 0Redis.MaxActiveInteger最大活跃连接数Y0 表示无限制必须大于等于 0Redis.PasswordStringRedis 密码N不配置则禁用认证-Log.OpenDebugBoolean模块调试开关N默认值为false-配置示例[Basic] ProductRulePath mod_ai_token_auth/token_rule.data [Redis] # bns addr bns BLB.ALB-redis # timeout in ms connectTimeout 20 readTimeout 20 writeTimeout 20 # max idle connections maxIdle 20 # max active connections maxActive 100 # redis password (optional) password [Log] OpenDebug false配置加载与校验的源码实现基础配置由 conf_mod_ai_token_auth.go 加载。Check方法L54-L78执行以下校验ProductRulePath为空时使用默认值mod_ai_token_auth/token_rule.data并通过bfe_util.ConfPathProc解析为相对于 conf 根目录的绝对路径Redis.Bns必须通过redis_client.CheckRedisConf校验Redis.ConnectTimeout、ReadTimeout、WriteTimeout必须大于 0。模块初始化时Init将这些配置组装为redis_client.Options含 BNS、最大空闲/活跃连接、三类超时与密码创建 Redis 客户端随后调用loadProductRuleConf加载规则文件。规则文件支持通过 reload 接口mod_ai_token_auth携带path参数热更新未指定 path 时回退到配置中的ProductRulePath。规则配置token_rule.datatoken_rule.data是模块的规则配置文件用于声明各产品线的 API-Key、配额计划以及 API-Key 认证规则。完整字段说明参见 token_rule.data.md。配置项说明顶层结构QuotaPlans、Tokens、Config均以产品线名为 key配置项类型含义是否必填补充说明生效条件VersionString配置文件版本Y通常为时间戳如20190101000000类型为 VersionQuotaPlans配额计划声明配置项类型含义是否必填补充说明生效条件QuotaPlansObject所有产品线的配额计划声明YKey 为产品线名称-QuotaPlans{k}String产品线名称Y--QuotaPlans{v}Array某产品线下的配额计划列表Y--QuotaPlans{v}[]Object配额计划Y--QuotaPlans{v}[].idString配额计划 IDY--QuotaPlans{v}[].unlimitedBoolean是否不限量Y--QuotaPlans{v}[].pass_no_quotaBoolean配额不足时是否仍放行请求Y--QuotaPlans{v}[].redis_keyString存储配额的 Redis keyNunlimited为 true 时可省略-QuotaPlans{v}[].create_timeInteger创建时间Unix 时间戳N--QuotaPlans{v}[].expired_timeInteger过期时间Unix 时间戳N-1表示永不过期必须大于等于-1QuotaPlans{v}[].quotaInteger配额总量N单位由unit字段决定unitRMB时为精度1e-8元的定点整数unlimited为 false 时必填unlimited为 false 时必须大于等于 0当unittotal_token时quota0表示计划无余额绑定该计划的请求以QuotaExhausted拒绝QuotaPlans{v}[].reset_modeInteger重置模式Y0- 非周期性1- 周期性配额包取值必须为0或1QuotaPlans{v}[].unitString配额单位N默认为total_token取值必须为total_token或RMBTokensAPI-Key 声明配置项类型含义是否必填补充说明生效条件TokensObject所有产品线的 API-Key 声明YKey 为产品线名称-Tokens{k}String产品线名称Y--Tokens{v}Object某产品线下的所有 API-KeyY--Tokens{v}{k}String一个 API-KeyY--Tokens{v}{v}ObjectAPI-Key 声明Y--Tokens{v}{v}.keyStringAPI-KeyY必须与外层 key 一致-Tokens{v}{v}.key_idStringAPI-Key IDY用于唯一标识 API-Key非空字符串Tokens{v}{v}.enabledInteger是否启用N--Tokens{v}{v}.statusIntegerAPI-Key 状态Y1- 启用2- 禁用3- 过期4- 耗尽取值必须为1、2、3或4Tokens{v}{v}.update_timeInteger更新时间Unix 时间戳N变更意味着新的配额消耗周期开始重新计算已用配额-Tokens{v}{v}.expired_timeInteger过期时间Unix 时间戳N-1表示永不过期必须大于等于-1Tokens{v}{v}.unlimited_quotaBoolean是否不限量Y--Tokens{v}{v}.allow_modelsString允许的模型列表N多个模型名以逗号分隔不能包含空字符串Tokens{v}{v}.block_modelsString禁止的模型列表N多个模型名以逗号分隔不能包含空字符串Tokens{v}{v}.subnetString允许的来源 IP 子网N多个子网以逗号分隔必须是合法的 CIDR 格式Tokens{v}{v}.tagsArrayAPI-Key 标签列表N--Tokens{v}{v}.tags[]ObjectAPI-Key 标签N--Tokens{v}{v}.tags[].keyString标签名N如department-Tokens{v}{v}.tags[].valueString标签值N如engineering-Tokens{v}{v}.quota_plansArray关联的配额计划 ID 列表Nunlimited_quota为 false 时必填unlimited_quota为 false 时非空Config认证规则配置项类型含义是否必填补充说明生效条件ConfigObject所有产品线的 API-Key 认证规则配置YKey 为产品线名称-Config{k}String产品线名称Y--Config{v}Array某产品线下的 API-Key 认证规则列表Y--Config{v}[]ObjectAPI-Key 认证规则Y--Config{v}[].condString匹配条件Y语法见 condition_grammar.md-Config{v}[].actionObject动作Y仅支持一个动作{ cmd: CHECK_TOKEN }-Config{v}[].action.cmdString动作命令Y固定为CHECK_TOKEN取值必须为CHECK_TOKEN配置示例{ Version: 20190101000000, QuotaPlans: { example_product: [ { id: daily_quota, unlimited: false, pass_no_quota: false, redis_key: ai:quota:daily_quota, create_time: 1672531200, expired_time: -1, quota: 100000, reset_mode: 1, unit: total_token }, { id: daily_rmb_quota, unlimited: false, pass_no_quota: false, redis_key: ai:quota:daily_rmb_quota, create_time: 1672531200, expired_time: -1, quota: 90000000, reset_mode: 0, unit: RMB } ] }, Tokens: { example_product: { TESTKEY: { key: TESTKEY, key_id: test_key_id, status: 1, expired_time: -1, unlimited_quota: false, allow_models: model_a,model_b, block_models: model_c, subnet: 192.168.0.0/24, tags: [ {key: department, value: engineering} ], quota_plans: [daily_quota] } } }, Config: { example_product: [ { cond: default_t(), action: { cmd: CHECK_TOKEN } } ] } }配额语义与关键注意事项当unit total_token时quota为整数 token 数当unit RMB时quota为精度1e-8元的定点整数即 1 单位 0.00000001 元。例如90000000表示0.9元当unlimited为 false 时quota必须大于等于 0。quota为 0 表示计划没有余额绑定该计划的请求会被以QuotaExhaustedHTTP 429拒绝。规则文件加载与校验的源码实现规则文件由 token_rule_load.go 中的ProductRuleConfLoad加载JSON 解码后依次执行productRuleConfCheck校验Version、Config、Tokens、QuotaPlans均不可缺失再完成条件表达式编译condition.Build与各层的 convert 转换最终通过TokenRuleTable.Update原子替换规则表读写锁保护见 token_rule_table.go。关键校验逻辑包括配额计划校验quotaPlanCheckid非空、expired_time -1unit为空时向后兼容地视为total_token非法单位报错非限量计划下quota 0报错RMB 单位同样不允许负数——quota 0被显式允许表示无余额语义token_rule_load.goToken 校验tokenCheck见 token.gokey、key_id非空expired_time -1unlimited_quota为 false 时quota_plans必须非空allow_models/block_models按逗号拆分并去除空格后不允许出现空字符串subnet使用net.ParseCIDR校验合法性Token 与配额计划绑定tokenConvertquota_plans中的每个 ID 必须能在同产品线的QuotaPlans中查到否则加载报错动作校验ActionFileCheckcmd必须固定为CHECK_TOKEN。仓库内置的真实配置仓库conf/mod_ai_token_auth/目录下提供了开箱即用的参考配置mod_ai_token_auth.confProductRulePath指向mod_ai_token_auth/token_rule.dataRedis BNS 为BFE.poc-redis-wx三组超时均为 20msmaxIdle 20调试开关关闭token_rule.data声明了example_product产品线下的TESTKEYkey_id TESTKEY_ID、status 1、expired_time -1、unlimited_quota trueConfig与QuotaPlans为空列表适合作为初始模板在此基础上逐步补充规则与配额计划。小结mod_ai_token_auth 为 BFE 上的 LLM 服务网关提供了完整的 API-Key 生命周期管理能力从请求入口的规则匹配到 Token 状态/过期校验、模型白名单与 IP 子网双重权限控制再到基于 Redis 的配额余额检查与请求完成后的原子扣减并配套REQ_TOTAL/REQ_AUTH/REQ_AUTH_FAIL等监控指标。实践中只需配置好mod_ai_token_auth.confRedis 连接与token_rule.data产品线、Token、配额计划、认证规则即可为下游 LLM 服务快速接入 token 鉴权与按 token 数或金额计费的配额体系规则文件支持运行时热加载配合PriceLookupMiss等计数器可及时发现价格表配置问题。赞分享后端网络/通信云原生【免费下载链接】bfeA modern layer 7 load balancer from baidu项目地址https://gitcode.com/gh_mirrors/bf/bfe点击查看免费下载相关推荐BFE mod_ai_token_auth 模块基础配置详解API Key 鉴权与配额扣减的 Redis 联动BFE mod_ai_token_auth 模块基础配置详解API Key 鉴权与配额扣减的 Redis 联动 导读 mod_ai_token_auth 是后端网络/通信云原生BFE mod_ai_token_auth token_rule.data 配置完全指南API-Key 认证与配额管理规则文件BFE mod_ai_token_auth token_rule.data 配置完全指南API Key 认证与配额管理规则文件 本文是 BFE现代七层负载均后端网络/通信云原生Elsa Diagnostics Structured Logs结构化日志捕获、脱敏、持久化与实时推送的完整实现指南Elsa Diagnostics Structured Logs结构化日志捕获、脱敏、持久化与实时推送的完整实现指南 导读 Elsa.Diagnostics.后端网络/通信云原生上一篇CANN ops-math LogicalOr 算子 aclnn API 使用指南aclnnLogicalOr 与 aclnnInplaceLogicalOr 两段式调用详解下一篇2025年AI工作流终极对决sim vs GitHub Actions谁才是自动化王者创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考