You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:20:27