如何在GraphQL中实现符合PSD2规范的OTP式双因素认证?
在GraphQL中实现符合PSD2规范的双因素认证(2FA)方案
可行性说明
完全可行。GraphQL仅作为API交互层,2FA的业务逻辑及PSD2合规要求可在后端服务层实现,GraphQL只需提供对应的查询/突变(Mutation)接口完成认证流程对接,不会对合规性造成限制。
PSD2合规核心要求对应
PSD2要求的2FA需满足至少两类独立认证要素,且要素间泄露互不影响:
- 知识类:用户独知的内容(如登录密码)
- 占有类:用户独有的物品(如绑定的手机、硬件令牌)
- 固有类:用户本身特征(如指纹、面部识别)
实现时需确保不同类要素的逻辑完全隔离,且所有认证数据全程加密存储与传输。
一次性密码(OTP)的实现步骤
1. 用户要素绑定
用户需先完成基础认证(如密码验证),绑定占有类要素(手机号、邮箱或TOTP令牌应用):
- 存储要素信息时需加密处理(如手机号用AES加密,或哈希加盐存储),禁止明文保存。
- 若使用TOTP,需为用户生成唯一密钥,通过二维码展示给用户扫描绑定(密钥需加密存储在服务端)。
2. GraphQL接口设计
需提供两个核心Mutation接口:
请求OTP接口:
mutation RequestOtp($input: RequestOtpInput!) { requestOtp(input: $input) { success message expiresAt } } input RequestOtpInput { userId: ID! # 需先验证用户已完成知识类认证(如密码正确),可通过请求头的临时凭证验证 }接口逻辑:验证用户基础认证通过后,生成OTP并发送至绑定的载体,返回OTP有效期。
验证OTP接口:
mutation VerifyOtp($input: VerifyOtpInput!) { verifyOtp(input: $input) { success authToken # 包含2FA验证标记的JWT或会话凭证 } } input VerifyOtpInput { userId: ID! otp: String! }接口逻辑:校验OTP的有效性(匹配性、有效期),验证通过后返回带2FA标识的认证凭证,后续接口可通过该凭证判断用户已完成双因素认证。
3. OTP生成与发送
- 生成逻辑:
- 推荐使用TOTP(RFC 6238)算法,基于当前时间戳和用户唯一密钥生成OTP,有效期设为30-60秒,符合PSD2实时性要求。
- 若使用短信/邮件OTP,生成6-8位随机数字,存储时需对OTP做哈希处理(如SHA-256加盐),禁止明文存储。
- 发送逻辑:
- 短信/邮件OTP调用第三方服务商API发送,确保传输全程使用HTTPS。
- TOTP无需主动发送,用户通过令牌应用实时生成。
4. 合规强化措施
- 要素隔离:知识类认证(密码)与OTP验证逻辑分属不同服务模块,避免单点泄露影响两类要素。
- 数据保护:OTP密钥、用户绑定信息全程加密存储,OTP验证通过后立即失效,禁止重复使用。
- 审计记录:记录OTP请求、发送、验证的全流程日志,包含时间、用户ID、结果,满足PSD2审计要求。
内容的提问来源于stack exchange,提问作者Teeage
相关产品推荐
相关产品推荐

