使用谷歌reCaptcha进行AWS-Cognito bot预防

Fab*_*oen 6 recaptcha amazon-web-services aws-cognito

如果用户是机器人或人类,我的问题是POST-Request.

无法从客户端发送请求表单,否则您将在OPTIONS请求中收到错误:"(对预检请求的响应未通过访问控制检查:否存在'Access-Control-Allow-Origin'标头在请求的资源上)",这是因为请求只能从服务器端进行.

在AWS-Cognito中,有一种方法可以使用预身份验证功能来检查类似的内容,但是我找不到将响应元素放入函数的方法.

所以我的问题是:有没有办法在AWS Cognito上实施Google recaptcha?

Mat*_*les 4

您可以在注册请求中发送此信息validationData,并在触发器 SNS Lambda 中执行验证码验证逻辑

这是使用AWS Amplify 库的片段,请原谅打字稿:

客户

class AuthService {
  ...

  public signUp(
    emailAddress: string,
    phoneNumber: string,
    password: string,
    recaptchaToken: string
  ): Observable<ISignUpResult> {

    const recaptchaTokenAttributeData: ICognitoUserAttributeData = {
      Name: 'recaptchaToken',
      Value: recaptchaToken
    };

    const signupParams: SignUpParams = {
      username: emailAddress,
      password,
      attributes: {
        'email': emailAddress,
        'phone_number': phoneNumber
      },
      validationData: [
        new CognitoUserAttribute(recaptchaTokenAttributeData)
      ]
    };

    return fromPromise(Auth.signUp(signupParams));
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)

PreSignUp SNS Lambda 代码上的 Cognito 触发器

export async function validateHuman(
  event: CognitoUserPoolTriggerEvent, 
  context: Context, 
  callback: Callback
): Promise<CognitoUserPoolTriggerHandler> {

  try {
    const recaptchaToken: string = event.request.validationData.recaptchaToken;

    console.log(recaptchaToken);

    const isHuman: boolean = await googleRecaptcha.verify({response: recaptchaToken}, (error: Error) => {
      if (error) {
        console.error(error);

        return false;
      }

      return true;
    });

    if (!isHuman) {
      throw new Error('Not human');
    }

    callback(null, event);

    return;
  } catch (error) {
    console.error(error);
    callback(null, new Response(INTERNAL_SERVER_ERROR, {message: 'Something went wrong'}));

    return;
  }
}
Run Code Online (Sandbox Code Playgroud)