4、身份认证体系:多因素认证(MFA)、OAuth2.0协议、JWT令牌设计、单点登录(SSO)
身份认证,说白了就是证明「你是你」的过程。在支付系统里,这一步要是出了岔子,后果不堪设想。我见过太多因为认证体系薄弱导致的资金盗刷案例,所以今天咱们好好聊聊这块。
4.1 多因素认证(MFA)——别只靠一把锁
你想想看,如果家里大门只装一把锁,小偷撬开就全完了。支付系统也一样,光靠密码太危险。多因素认证,就是给门加上第二把、第三把锁。
MFA 通常基于三类因素:
- 你知道的:密码、PIN码
- 你拥有的:手机、硬件令牌、U盾
- 你本身的:指纹、人脸、声纹
在支付场景里,我建议至少启用两种不同类别的因素。比如密码+短信验证码,或者密码+生物识别。我曾经遇到过一个客户,只靠密码做风控,结果被撞库攻击,一夜之间损失了几十万。后来他们上了 MFA,类似问题再没出现过。
核心原则:MFA 不是选配,是标配。尤其是涉及资金操作、修改敏感信息时,必须强制启用。
实战技巧:别用短信验证码作为唯一第二因素。短信有被劫持的风险(比如 SIM 卡克隆)。我个人更推荐 TOTP(基于时间的一次性密码)或推送认证。
4.2 OAuth2.0 协议——授权,不是把钥匙给别人
很多人搞混了认证和授权。认证是「你是谁」,授权是「你能干什么」。OAuth2.0 解决的是授权问题,不是认证问题。
OAuth2.0 有四种授权模式,支付系统里最常用的是:
- 授权码模式(Authorization Code):最安全,适合有后端的应用
- 客户端凭证模式(Client Credentials):服务间调用,没有用户参与
- 隐式模式(Implicit):已不推荐,安全风险高
- 密码模式(Password):尽量别用,相当于把密码交给第三方
嗯,这里要注意。支付系统里,我强烈建议只用授权码模式。为什么?因为它支持 refresh token,而且 access token 不会暴露在浏览器 URL 里。我在项目中见过有人图省事用隐式模式,结果 token 被截获,用户信息泄露。教训深刻啊。
避坑指南:我曾经接手过一个项目,他们把 OAuth2.0 的 client_secret 硬编码在移动端代码里。这相当于把家门钥匙放在门口垫子下。正确的做法是:client_secret 只保存在后端,移动端用 PKCE(Proof Key for Code Exchange)增强安全性。
4.3 JWT 令牌设计——轻量但别轻视
JWT(JSON Web Token)现在几乎是标配了。它由三部分组成:Header、Payload、Signature。格式长这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
设计 JWT 时,有几个关键点:
- 签名算法:用 RS256(非对称)而不是 HS256(对称)。HS256 要求服务端和客户端共享密钥,一旦泄露全完蛋。RS256 用私钥签名、公钥验证,更安全。
- 过期时间:access token 设短一点,比如 15 分钟。refresh token 可以长一些,但也要有上限。
- Payload 别放敏感信息:JWT 的 payload 只是 base64 编码,不是加密。放身份证号、银行卡号?那是找死。
我的习惯:JWT 里只放用户 ID、角色、过期时间。其他信息通过 API 查询获取。这样即使 token 泄露,损失也有限。
另外,JWT 有个天然缺陷——无法主动失效。你没法让一个已签发的 JWT 立即失效。怎么办?我一般维护一个黑名单(Redis 里存 revoked token 的 jti),每次请求时检查一下。虽然多了一次查询,但值得。
4.4 单点登录(SSO)——一次登录,到处通行
SSO 解决的是多系统间的登录体验问题。用户登录一次,就能访问所有关联系统。支付系统里,SSO 常用于商户后台、运营平台等场景。
实现 SSO 的主流方案有两种:
- 基于 Cookie 的 SSO:所有子系统共享同一个顶级域名,通过 Cookie 传递会话信息。简单,但跨域支持差。
- 基于 Token 的 SSO:通过中心认证服务(CAS)或 OAuth2.0 + OIDC 实现。更灵活,适合跨域、跨组织的场景。
我个人更推荐后者。为什么?因为支付系统往往涉及多个独立域名的服务,比如 api.pay.com、merchant.pay.com、admin.pay.com。用 Token 方案,每个服务只需验证 token 有效性,不需要共享 Cookie 域。
实战经验:我曾经帮一个电商平台搭建 SSO,他们一开始用共享 Cookie 方案,结果第三方支付回调时 Cookie 带不过去,折腾了两周。后来换成 OAuth2.0 + OIDC,一周搞定。选对方案,事半功倍。
4.5 知识体系总览
下面这张图,把身份认证体系的核心逻辑串起来了。你看一眼就明白:
从这张图能看出来,身份认证体系是层层递进的。用户先通过 MFA 验证身份,然后 SSO 负责跨系统会话,OAuth2.0 处理授权,JWT 作为令牌载体。每一层都有自己的职责,缺一不可。
最后提醒一句:别为了用户体验牺牲安全性。我见过有人为了「让用户少输一次密码」,把 MFA 关了,结果被撞库攻击。安全是支付系统的生命线,认证体系就是第一道防线。守住了,后面的事才好办。
公众号:蓝海资料掘金营,微信deep3321