API密钥、令牌和访问任务:安全身份验证
文章全文
1)为什么要这样做: iGaming的威胁模型
金钱和PII:钥匙的损害→盗窃,泄漏,罚款。
网络集成:数十个外部提供商,不同区域/许可证。
高SLA利率:简单或双倍支付-声誉和法律风险。
结论:身份验证和授权必须"默认安全",具有最小的权限和可观察性。
2)工具: 我们在军火库中拥有什么
API密钥:静态客户端ID。集成简单,泄漏风险高。
OAuth2 (Client Credentials):带有scope/audience的短寿命啤酒代币。
mTLS:相互的TLS验证,强大的客户端链接到通道。
HMAC/EdDSA签名:请求主体的加密完整性和响应保护(timestamp+nonce)。
Proof-of-Possession: MTLS绑定令牌或DPoP(客户端密钥签名HTTP请求)。
JWT/PASETO:自签名令牌(最好是短TTL)。
RBAC/ABAC:角色/属性重读授权(ORA/策略解决方桉)。
临时访问授权(delegation/STS):为特定情景发放的时间和目标限制票。
3)基本原则("停止标志")
1.Least Privilege:每个钥匙/令牌都是最小的权利。
2.短暂的默认生活:TTL几分钟,不是几天。轮换是自动的。
3.Bind to channel:将令牌绑定到mTLS/DPoP →泄漏时无用。
4.Per-brand/region:钥匙/证书和许可证-品牌/许可证/地区。
5.代码中没有共享的秘密:仅通过Vault/HSM/KMS或Git/Logs中的秘密。
6.WORM审核:所有操作/签发/轮换的不变日志。
7.写入路径上的等效性:使用相同密钥的任何重播都不会第二次改变金钱。
4)何时使用(iGaming上下文)
5)访问任务设计(scopes, audience,条件)
Scope-y(示例):- `bets:write`, `settlements:write`, `wallet:credit`, `wallet:debit`, `rg:read`, `rg:enforce`, `jackpot:trigger`.
听众: 令牌的对象是谁(例如'aud:wallet。api`).
Constraints (fine-grained):
`brand_id`, `region`, `ip/cidr`, `time_of_day`, `rate_limit`, `max_amount`.
存储在令牌(JWT claims)或Vault/STS中已签出的"任务"中。
6)参考浮动
6.1 RGS ⇄平台: RPC资金
1.mTLS手动(按品牌/地区认证)。
2.OAuth2 CC: RGS收到'access_token' (TTL 2-5 min, 'aud=wallet.api`, `scope=bets:write settlements:write`).
3.查询"POST/v1/bets/authorize"标题:- `Authorization: Bearer `, `X-Idempotency-Key`, `X-Trace-Id`. 
- 4.响应+在WORM审核中写入(谁/什么/何时/何地)。
- 5.令牌的旋转是无缝的,过期后是CC重复。
6.2 Webhuki平台→提供商
标题"X-Signature: eddsa=
提供者检查:有效性窗口(± 5分钟),一次性"nonce",身体签名。
如果不可用,则通过"event_id"进行后退。
6.3委托(头奖服务→钱包)
JP调用STS:"在'wallet:credit'上给临时令牌,"player_id=p_……",总和≤ X,TTL 2分钟"。
STS检查政策/限制→发布授权(窄令牌)。
JP用这个令牌借钱包。妥协这样的令牌毫无意义:短的TTL,狭窄的权限,绑定到mTLS。
7)查询设计
7.1相似性(必修)
POST /v1/bets/settle
Authorization: Bearer <MTLS-bound>
X-Idempotency-Key: settle_r_8c12_1
X-Trace-Id: tr_a1b2
{
"bet_id":"b_001",  "round_id":"r_8c12",  "win":{"amount":1460,"currency":"EUR"}
}
→ 200 { "status":"credited", "settlement_id":"st_77" }
(重复使用相同的键→相同的响应)7.2 webhook标题(HMAC)
X-Signature: sha256=BASE64(HMAC(secret, timestamp + "." + nonce + "." + body))
X-Timestamp: 1730000000
X-Nonce: 1f7a...8)秘密和密钥管理
Vault/HSM/KMS:生成、存储、轮换、召回。
常规环境:sandbox/prod是不同的信任根源。
Per品牌/地区:单个密钥和证书。
自动轮换:cron/警报;用于无缝替换的覆盖期。
禁令:密码不写在stdout中,不属于崩溃报告。
设备/工作负载身份:SPIFFE/SPIRE, K8s ServiceAccount → mTLS没有手动秘密。
9)授权政策(RBAC/ABAC)和OPA
RBAC: роли «rgs», «wallet», «jackpot», «reporting».
ABAC:规则"如果'region=EU'和'brand=A' →允许'wallet: credit' ≤ 10k"。
OPA/REGO或类似物:集中决策,策略验证,干燥测试。
10)可观察性和审计
每个查询/事件中的端到端"trace_id"和"client_id"。
度量标准:p50/p95/p99 latency by enpointes, error-rate by codes ('AUTH_FAILED'、'SCOPE_DENIED'、'IDEMPOTENCY_MISMATCH'),轮换频率,逾期百分比代币。
WORM日志:令牌签发/评论,更改密钥,更改策略。
Alerts: "AUTH_FAILED"激增,地理/ASN异常,生长"逾期/召回">阈值。
11)区域居住和细分
代币/证书与区域相关(EU/UK/BR/……)。
在"区域"中,平台网关禁止跨区域调用。
每个区域分别使用KMS和Vault群集;钥匙不是在区域之间"开车"。
12)事件和召回
Compromise剧本:即时恢复key/令牌, network/ASN,关闭scope。
网关级别的杀手开关:"no new sessions/funds"。
Postmortham:"如何进入博客/存储库","为什么秘密DLP/扫描仪不起作用"。
13)支票单
A.为平台
- 所有写路径:mTLS+OAuth2 CC(TTL ≤ 5分钟),"X-Idempotency-Key","X-Trace-Id"。
- Webhooks:HMAC/EdDSA+timestamp+nonce,"event_id"的去世。
- Keystor: Vault/HSM/KMS,轮换和召回,按品牌/地区划分。
- ORA/策略: RBAC/ABAC,变更日志,测试。
- WORM审核和SLO-dashbords (latency, error, revoke/rotate)。
- DR/xaoc演习:代币到期,签名变换,没有mTLS的MITM。
B.供应商(RGS/live/JP)
- 不要在代码中存储秘密;通过环境变量使用Vault/子菜单。
- 代币自动旋转;带更新的handle 401/403。
- 签名webhooks/检查有效性和一次性窗口。
- 对关键行动进行审核并回应Deprecation/Sunset头条新闻。
- 在所有写作挑战中都具有相等性,在"Idempotency-Key"上表现出色。
14)反模式(红旗)
没有保质期的静态API密钥。
不带通道的Bearer令牌(没有MTLS/DPoP)。
在Git/CI Log/configa frontenda中存储秘密。
多个品牌/地区的通用密钥/证书。
没有签名的Webhooks和→中继的时间窗口。
没有集中召回和WORM日志。
缺乏相同的能力→借记/贷记。
15)迷你政治模式(示例,人性化)
授权"rgs→wallet"(欧盟,品牌A):- `aud=wallet.api`, `scope=["bets:write","settlements:write"]`
- `constraints: region=EU, brand=A, ip in {asn:…}, max_amount=5000 EUR, ttl=300s`
- `binding: mTLS(cert_hash=sha256:…)`
Webhook'wallet。credit.ok`:
'alg=Ed25519',窗口'± 300s','nonce'是独一无二的,dedup'event_id' 24小时。
iGaming中的安全身份验证是实践的组合:简短的任务授权,链路绑定(mTLS/DPoP),狭窄的scope/audience,严格的等效性,Vault/HSM和WORM审计,区域细分和可观察性。这样的堆栈不会干扰集成的速度,而是从根本上降低了泄漏和金融事件的风险-金钱和数据仍然受到控制,升级可以预见,并且合规性是"开箱即用的"。
