如何使用 javascript 从 Firebase 电话身份验证中删除验证码?

Posted

技术标签:

【中文标题】如何使用 javascript 从 Firebase 电话身份验证中删除验证码?【英文标题】:How to remove captcha verification from Firebase phone auth using javascript? 【发布时间】:2018-12-13 13:33:50 【问题描述】:

我是第一次使用 firebase 电话身份验证,我看到验证码必须按照 firebase 官方文档继续进行。虽然它起到了很好的作用,但有时当它开始询问路标、桥梁和所有东西时,它会变得对用户体验非常不利。有没有办法在获取用户号码后直接跳到验证码?根据文档,代码如下所述。谢谢。

var phoneNumber = getPhoneNumberFromUserInput();
var appVerifier = window.recaptchaVerifier;
firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier)
    .then(function (confirmationResult) 
      // SMS sent. Prompt user to type the code from the message, then sign the
      // user in with confirmationResult.confirm(code).
      window.confirmationResult = confirmationResult;
    ).catch(function (error) 
      // Error; SMS not sent
      // ...
);

var code = getCodeFromUserInput();
confirmationResult.confirm(code).then(function (result) 
  // User signed in successfully.
  var user = result.user;
  // ...
).catch(function (error) 
  // User couldn't sign in (bad verification code?)
  // ...
);

【问题讨论】:

【参考方案1】:

在身份验证设置中使用isAppVerificationDisabledForTesting = TRUE,如下给定的sn-p:

Auth.auth().settings.isAppVerificationDisabledForTesting = TRUE

更多详情请查看以下官方信息:

javascript - https://firebase.google.com/docs/reference/js/firebase.auth.AuthSettings

SDK 参考 - https://firebase.google.com/docs/auth/ios/phone-auth#integration-testing

【讨论】:

有什么解决办法吗?【参考方案2】:

我在集成 iOS SDK 时遇到了同样的问题。

如果 google 具有跨语言的相同架构和类的 firebase SDK,则此解决方案可能适合您。

Auth.auth().settings?.isAppVerificationDisabledForTesting = true

【讨论】:

谢谢!对于网络 SDK:从 'firebase/app' 导入 firebase; firebase.auth().settings.appVerificationDisabled = true appVerificationDisabledForTesting = true 如标签所示,这是用于测试的。这不是您的应用程序的长期解决方案。您实际上需要将您正在使用的电话号码列入白名单。它只是让迭代测试更快【参考方案3】:

使用尺寸:“正常”到尺寸:“不可见”

 window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier(
    "recaptcha-container",
    
      size: "invisible",
      callback: function(response) 
        submitPhoneNumberAuth();
      
    
  );

【讨论】:

【参考方案4】:
 firebase.initializeApp(firebaseConfig);
  // Create a Recaptcha verifier instance globally
  // Calls submitPhoneNumberAuth() when the captcha is verified
  window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier(
    "recaptcha-container",
    
      size: "invisible",
      callback: function(response) 
        submitPhoneNumberAuth();
      
    
  );

【讨论】:

【参考方案5】:

Firebase 为验证码大小提供了两个属性

    正常 - 对用户可见且验证码可见,并手动执行验证码过程。 不可见 - 对用户不可见,自动验证码过程,代码将在 DOM 中自动呈现。
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier(
    "recaptcha-container", 
        size: "invisible"
    
);

更多详情请参考此Official链接

【讨论】:

Invisable 有时会出现,替换整个屏幕;例如,如果您连接到 *** 并重新加载此窗口,它可能会触发它。【参考方案6】:

实际上你不能。但是,有些设备它不起作用。相反,设置安全并启用 API 密钥。然后回到您在 Firebase 中的项目设置,如果不存在,则将 SHA-25 从 android Gradle 复制并粘贴到那里。这样,在应用程序浏览器重定向将不会再刺激你...

【讨论】:

对于 SafetyNet Google Cloud 参考 firebase.google.com/docs/auth/android/phone-auth【参考方案7】:

方法一:

firebase.auth().settings.appVerificationDisabledForTesting = true;

Firebase 文档

https://firebase.google.com/docs/auth/web/phone-auth?authuser=0#web-v8_6

// Turn off phone auth app verification.
firebase.auth().settings.appVerificationDisabledForTesting = true;

var phoneNumber = "+16505554567";
var testVerificationCode = "123456";

// This will render a fake reCAPTCHA as appVerificationDisabledForTesting is true.
// This will resolve after rendering without app verification.
var appVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container');
// signInWithPhoneNumber will call appVerifier.verify() which will resolve with a fake
// reCAPTCHA response.
firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier)
    .then(function (confirmationResult) 
      // confirmationResult can resolve with the fictional testVerificationCode above.
      return confirmationResult.confirm(testVerificationCode)
    ).catch(function (error) 
      // Error; SMS not sent
      // ...
    );

方法二:

https://firebase.google.com/docs/auth/web/phone-auth#use-invisible-recaptcha

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

【讨论】:

感谢 ßãlãjî 的分享。我实现了方法 2,但是 onSignInSubmit();根本不叫。有什么建议吗?【参考方案8】:

转到 Firebase 控制台 -->您的项目-->项目概览设置-->项目设置 --> 应用检查 -->概览(为您的应用注册 SafetyNet)。

然后您的应用将停止重定向到网络进行验证码验证

【讨论】:

这仅适用于移动设备,适用于网络则不同【参考方案9】:

根据谷歌官方文档有 2 件事:

    向 Firebase 添加 Sha-256 密钥

    启用安全网:https://console.cloud.google.com/apis/library/androidcheck.googleapis.com

要使用电话号码身份验证,Firebase 必须能够验证电话号码登录请求是否来自您的应用。 Firebase 身份验证可通过两种方式完成此操作:

SafetyNet:如果用户的设备安装了 Google Play 服务,并且 Firebase 身份验证可以通过 Android SafetyNet 验证该设备是否合法,则可以继续使用电话号码登录。 启用 SafetyNet 以用于 Firebase 身份验证:

在 Google Cloud Console 中,为您的项目启用 Android DeviceCheck API。将使用默认的 Firebase API 密钥,并且需要被允许访问 DeviceCheck API。 如果您尚未指定应用的 SHA-256 指纹,请从 Firebase 控制台的设置页面执行此操作。有关如何获取应用的 SHA-256 指纹的详细信息,请参阅验证您的客户端。


更多详情:https://firebase.google.com/docs/auth/android/phone-auth

【讨论】:

以上是关于如何使用 javascript 从 Firebase 电话身份验证中删除验证码?的主要内容,如果未能解决你的问题,请参考以下文章

如何从孩子(firebase)查询所有孩子的值[重复]

将图片从 URL 上传到 Firebase 存储

如何使用 Yarn 定位单个工作区?

Python:无法从函数中读取返回值

使用后退按钮退出应用程序后,我只能从共享偏好中获取值

如何将 Flutter Bloc 与 Firebase 电话身份验证一起使用