Bỏ qua, đến nội dung

Tham chiếu API — Verification ​

Resource: verifiers ​

verifiers:listByUser ​

Liệt kê verifiers mà user hiện tại đã liên kết.

Quyền: loggedIn

Response:

json
{
  "data": [
    {
      "name": "sms-otp-aliyun",
      "title": "SMS Verification",
      "verificationType": "sms-otp",
      "boundInfo": { "phone": "****1234" }
    }
  ]
}

verifiers:listForVerify ​

Liệt kê verifiers khả dụng để xác minh (bao gồm cả verifiers chưa liên kết).

Quyền: loggedIn

verifiers:bind ​

Liên kết verifier mới với tài khoản user.

Quyền: loggedIn

Request body:

json
{
  "verifier": "sms-otp-aliyun",
  "phone": "+84912345678"
}

Khi bindingRequired: true, user cần xác minh qua OTP trước khi liên kết hoàn tất.

verifiers:unbind ​

Xóa liên kết verifier.

Quyền: loggedIn + xác minh qua scene unbind-verifier

Request body:

json
{
  "verifier": "sms-otp-aliyun"
}

Resource: smsOTP ​

smsOTP:create ​

Tạo và gửi mã OTP qua SMS.

Quyền: loggedIn

Request body:

json
{
  "phone": "+84912345678"
}

smsOTP:publicCreate ​

Tạo SMS OTP không cần đăng nhập — dùng cho luồng đăng ký hoặc quên mật khẩu.

Quyền: public

VerificationManager API ​

registerVerificationType(name, config) ​

Đăng ký loại verification mới.

typescript
verificationManager.registerVerificationType('email-otp', {
  title: tval('Email OTP'),
  description: tval('Mã xác minh qua email'),
  bindingRequired: false,
  verification: EmailOTPVerification,
});
Tham sốKiểuMô tả
titlestringTên hiển thị
descriptionstringMô tả
bindingRequiredbooleanCó yêu cầu user liên kết trước không
verificationclassClass xử lý gửi/xác minh OTP

registerScene(name, config) ​

Đăng ký kịch bản xác minh.

typescript
verificationManager.registerScene('custom-action', {
  actions: {
    'myResource:sensitiveAction': {
      getUserIdFromCtx: (ctx) => ctx.state.currentUser?.id,
      async onVerifySuccess(ctx, userId) {
        // Xử lý sau khi xác minh thành công
      },
    },
  },
  getVerifiers: async () => ['sms-otp-aliyun'],
});

addSceneRule(rule) ​

Thêm quy tắc cho phép scene nào dùng verification type nào.

typescript
verificationManager.addSceneRule((scene, verificationType) => {
  return scene === 'my-scene' && verificationType === 'sms-otp';
});

registerAction(actionName, config) ​

Đăng ký action cần xác minh.

typescript
verificationManager.registerAction('verifiers:bind', {
  manual: true,
  getBoundInfoFromCtx: (ctx) => ctx.action.params.values || {},
});
Tham sốMô tả
manualtrue nếu user tự cung cấp thông tin liên kết
getBoundInfoFromCtxHàm lấy thông tin liên kết từ context

middleware() ​

Trả về middleware chặn action cần xác minh. Plugin tự động đăng ký middleware này vào dataSourceManager.

SMSOTPProviderManager API ​

registerProvider(type, config) ​

Đăng ký SMS provider mới.

typescript
smsOTPProviderManager.registerProvider('twilio', {
  title: tval('Twilio SMS'),
  provider: twilioProvider,
});

Error Codes ​

Mã lỗiMô tả
VERIFICATION_EXPIREDMã OTP đã hết hạn
VERIFICATION_INVALIDMã OTP không đúng
VERIFICATION_MAX_ATTEMPTSVượt quá số lần thử tối đa
VERIFICATION_COOLDOWNCần chờ cooldown trước khi gửi lại
VERIFICATION_PROVIDER_ERRORLỗi từ SMS/email provider
ALREADY_BOUNDUser đã liên kết verifier này rồi
INVALID_VERIFIERVerifier không tồn tại