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

如何在Angular版Amplify UI的amplify-authenticator中添加验证码

Amplify Angular UI 验证码人机校验接入方案

Amplify Angular UI的amplify-authenticator组件没有提供验证码相关的内置配置项,可通过组件自定义插槽+提交流程拦截的方式实现。在你已经完成AWS侧基础配置、注册登录功能正常的前提下,按以下步骤操作即可:

  • 引入目标验证码组件:常用的reCAPTCHA、hCaptcha都有对应Angular封装,直接通过npm安装引入到认证模块即可,比如使用Google reCAPTCHA可以安装ng-recaptcha依赖。
  • 利用组件开放插槽插入验证码:amplify-authenticator提供了sign-in-form-fields(登录表单字段区)、sign-up-form-fields(注册表单字段区)两个自定义插槽,支持覆盖默认表单渲染逻辑,可在原有表单位置插入验证码组件。
  • 拦截默认提交逻辑:替换默认提交按钮,点击提交时先校验验证码是否完成,校验通过后再调用原生表单提交方法,校验不通过直接阻断流程提示用户。
  • (可选)服务端校验增强:如果需要更高安全等级,可以把前端拿到的验证码token通过clientMetadata参数传给Cognito,在预注册、预认证触发器中调用验证码服务商接口做二次校验,避免前端校验被绕过。

参考实现代码

组件模板代码:

<!-- 提前在模块中引入你使用的验证码模块,例如NgRecaptchaModule -->
<amplify-authenticator [loginMechanisms]="['email']" [signUpAttributes]="['name', 'phone_number']">
  <!-- 自定义登录表单区域 -->
  <ng-template amplifySlot="sign-in-form-fields" let-formFields="formFields" let-submitForm="submitForm">
    <!-- 渲染默认登录表单字段 -->
    <amplify-form-field *ngFor="let field of formFields" [field]="field"></amplify-form-field>
    <!-- 插入验证码组件 -->
    <re-captcha (resolved)="onCaptchaResolved($event, 'signin')" siteKey="你的验证码站点密钥"></re-captcha>
    <!-- 自定义提交按钮 -->
    <amplify-button type="submit" (click)="handleSignInSubmit(submitForm)">登录</amplify-button>
  </ng-template>

  <!-- 自定义注册表单区域 -->
  <ng-template amplifySlot="sign-up-form-fields" let-formFields="formFields" let-submitForm="submitForm">
    <amplify-form-field *ngFor="let field of formFields" [field]="field"></amplify-form-field>
    <re-captcha (resolved)="onCaptchaResolved($event, 'signup')" siteKey="你的验证码站点密钥"></re-captcha>
    <amplify-button type="submit" (click)="handleSignUpSubmit(submitForm)">注册</amplify-button>
  </ng-template>

  <!-- 原有登录成功逻辑保持不变 -->
  <ng-template amplifySlot="authenticated" let-user="user" let-signOut="signOut">
    <h1>Welcome {{ user.username }}!</h1>
    <button (click)="signOut()">Sign Out</button>
  </ng-template>
</amplify-authenticator>

对应TS逻辑代码:

import { Component } from '@angular/core';

@Component({
  selector: 'app-auth-page',
  templateUrl: './auth-page.component.html'
})
export class AuthPageComponent {
  // 存储不同场景的验证码校验结果
  private captchaToken: Record<'signin'|'signup', string> = {
    signin: '',
    signup: ''
  };

  // 验证码验证完成回调
  onCaptchaResolved(token: string, scene: 'signin' | 'signup') {
    this.captchaToken[scene] = token;
  }

  // 登录提交逻辑
  async handleSignInSubmit(submitForm: (values: any) => Promise<void>) {
    if (!this.captchaToken.signin) {
      alert('请先完成人机验证');
      return;
    }
    // 如需服务端校验验证码,可在此处先请求你的业务后端校验token有效性,通过后再往下执行
    await submitForm({
      clientMetadata: { captchaToken: this.captchaToken.signin }
    });
    // 提交后重置验证码状态
    this.captchaToken.signin = '';
  }

  // 注册提交逻辑
  async handleSignUpSubmit(submitForm: (values: any) => Promise<void>) {
    if (!this.captchaToken.signup) {
      alert('请先完成人机验证');
      return;
    }
    await submitForm({
      clientMetadata: { captchaToken: this.captchaToken.signup }
    });
    this.captchaToken.signup = '';
  }
}

注意:如果使用无图形的隐形验证码,可以把验证码触发逻辑绑定到提交按钮的点击事件上,验证完成后自动触发提交,不需要额外占位。

当前默认组件界面参考:
Amplify Authenticator 默认界面

内容的提问来源于stack exchange,提问作者Ranjith Varatharajan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:51:19