如何将 Firebase 隐形 reCAPTCHA 用于 Angular Web 应用程序?

Posted

技术标签:

【中文标题】如何将 Firebase 隐形 reCAPTCHA 用于 Angular Web 应用程序?【英文标题】:How to use Firebase invisible reCAPTCHA for angular web app? 【发布时间】:2018-04-03 08:12:01 【问题描述】:

希望看到一个可行的示例。搜索了很多,似乎无法让它在本地工作。始终显示隐私条款徽标,用户必须与验证码进行交互。

这是我创建的codepen 以加快速度。

来自Firebase-Docs:

使用不可见的 reCAPTCHA

要使用不可见的 reCAPTCHA,请创建一个 RecaptchaVerifier 对象,并将 size 参数设置为不可见,并指定提交登录表单的按钮的 ID。

window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('sign-in-button', 
  'size': 'invisible',
  'callback': function(response) 
    // reCAPTCHA solved, allow signInWithPhoneNumber.
    onSignInSubmit();
  
);

基本上我对 init 的看法是什么:

window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('phone-sign-in-recaptcha', 
  'size': 'invisible',
  'callback': function(response) 
    // reCAPTCHA solved - will proceed with submit function
    console.log(response);
  ,
  'expired-callback': function() 
    // Reset reCAPTCHA?
  
);
<form name="mobile" novalidate>
  <label class="item item-input">
    <i class="icon placeholder-icon"></i>
    <input type="tel" name="number" ng-model="$ctrl.user.mobile">
  </label>
  <button id="sign-in-button" ng-click="$ctrl.onSignInSubmit(user.mobile)"></button>
</form>
<div id="phone-sign-in-recaptcha"></div>

这是提交时调用的函数:

ctrl.onSignInSubmit = function() 
  var phoneNumber = '+1' + ctrl.user.mobile;
  var appVerifier = window.recaptchaVerifier;

  firebase.auth()
    .signInWithPhoneNumber(phoneNumber, appVerifier)
    .then(function(confirmationResult) 
      ctrl.hasCodeToVerify = true;
      console.log('confirmationResult', confirmationResult);
      window.confirmationResult = confirmationResult;
    ).catch(function(error) 
      console.log('error', error);
    );
;

【问题讨论】:

【参考方案1】:

这是一个使用不可见 reCAPTCHA 的工作示例:

https://github.com/firebase/quickstart-js/blob/master/auth/phone-invisible.html

在您的代码中,在您调用 signInWithPhoneNumber 之后,不可见的 reCAPTCHA 应该显示一个质询,当解决该质询时,使用confirmationResult 解决待处理的承诺,或者直接解决而不显示任何质询。

当该承诺以 confirmationResult 解决时,您应该向用户询问 SMS 代码。 然后你打电话给confirmationResult.confirm(code) 这将完成用户的登录。

firebase
  .auth()
  .signInWithPhoneNumber(phoneNumber, appVerifier)
  .then(function(confirmationResult) 
    var code = window.prompt("Please enter your code");
    return confirmationResult.confirm(code);
  )
  .then(function(result) 
    // User is signed in now.
  )
  .catch(function(error) 
    console.log("error", error);
  );

【讨论】:

我看过那个快速入门,它有一个渲染方法,我不确定它是否应该实际渲染挑战或自动完成它。我尝试在我的代码中使用它。要么没有正确使用它,要么无法解决挑战。我会做一个代码笔,所以也许你/其他人可以在那里提供帮助。 我看过你关于其他 firebase 和 ionic 问题的帖子。似乎这与原始 URL 有关。他们中的大多数都会收到带有不可见验证码的 HTTP 错误消息。 嘿@alphapilgrim,您似乎没有向用户询问短信代码。我添加了一个简单的示例来展示如何做到这一点。 非常正确@bojeil!我通过不同的点击事件在不同的功能中进行了确认。太感谢了!我正要从应用程序中删除这件作品。

以上是关于如何将 Firebase 隐形 reCAPTCHA 用于 Angular Web 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 上禁用 reCAPTCHA 验证以进行 Firebase 身份验证?

Firebase (Flutter) 验证电话号码始终需要 reCAPTCHA

firebase signInWithPhoneNumber recaptcha 客户端已被删除 0

Firebase 电话身份验证打开浏览器以在 Android 中进行重新验证

如何将recaptcha添加到mailform

如何将 Google Recaptcha v2 实施到限制访问 Google Recaptcha 的 Web 应用程序