Firebase phone auth不会在真实设备上发送代码 - React Native

时间:2018-04-09 18:39:13

标签: android reactjs firebase react-native firebase-authentication

我是React Native的新手并且使用RN& amp;使用 react-native-firebase 库的Firebase非常棒! 我的问题是,当我打电话给" signInWithPhoneNumber "没有生成短信代码,但我的手机号码已在Firebase控制台中注册。我的代码如下。谢谢

onLoginOrRegister = () => {
const { phoneNumber } = this.state;
firebase.auth().signInWithPhoneNumber(phoneNumber)
  .then((confirmResult) => {
    // This means that the SMS has been sent to the user
    // You need to:
    //   1) Save the `confirmResult` object to use later
    this.setState({ confirmResult });
    //   2) Hide the phone number form
    //   3) Show the verification code form
  })
  .catch((error) => {
    const { code, message } = error;
    // For details of error codes, see the docs
    // The message contains the default Firebase string
    // representation of the error
  });
  }

onVerificationCode = () => {
const { confirmResult, verificationCode } = this.state;
confirmResult.confirm(verificationCode)
.then((user) => {
  // If you need to do anything with the user, do it here
  // The user will be logged in automatically by the
  // `onAuthStateChanged` listener we set up in App.js earlier
})
.catch((error) => {
  const { code, message } = error;
  // For details of error codes, see the docs
  // The message contains the default Firebase string
  // representation of the error
});
 }

2 个答案:

答案 0 :(得分:0)

我实施了一次,但我必须在我的应用上添加WebView以呈现所需的Google页面,该页面负责发送和验证短信代码。

这是您必须以构建WebView

为基础的代码
<!DOCTYPE html>
<!--
Copyright (c) 2016 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html>
<head>
  <meta charset=utf-8 />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Phone Authentication simple popup flow</title>

  <!-- Material Design Theming -->
  <link rel="stylesheet" href="https://code.getmdl.io/1.1.3/material.orange-indigo.min.css">
  <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
  <script defer src="https://code.getmdl.io/1.1.3/material.min.js"></script>

  <link rel="stylesheet" href="main.css">
</head>
<body>
<div class="demo-layout mdl-layout mdl-js-layout mdl-layout--fixed-header">

  <!-- Header section containing title -->
  <header class="mdl-layout__header mdl-color-text--white mdl-color--light-blue-700">
    <div class="mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-grid">
      <div class="mdl-layout__header-row mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-cell--8-col-desktop">
        <a href="/"><h3>Firebase Authentication</h3></a>
      </div>
    </div>
  </header>

  <main class="mdl-layout__content mdl-color--grey-100">
    <div class="mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-grid">

      <!-- Container for the demo -->
      <div class="mdl-card mdl-shadow--2dp mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-cell--12-col-desktop">
        <div class="mdl-card__title mdl-color--light-blue-600 mdl-color-text--white">
          <h2 class="mdl-card__title-text">Phone number authentication simple popup flow</h2>
        </div>
        <div class="mdl-card__supporting-text mdl-color-text--grey-600">
          <p>Sign in with your Phone number below.</p>

          <!-- Button that starts the sign-in flow -->
          <button class="mdl-button mdl-js-button mdl-button--raised" id="sign-in-button">Sign-in with Phone number</button>

          <!-- Button that handles sign-out -->
          <button class="mdl-button mdl-js-button mdl-button--raised" id="sign-out-button">Sign-out</button>
        </div>
      </div>

      <!-- Container for the sign in status and user info -->
      <div class="mdl-card mdl-shadow--2dp mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-cell--12-col-desktop">
        <div class="mdl-card__title mdl-color--light-blue-600 mdl-color-text--white">
          <h2 class="mdl-card__title-text">User sign-in status</h2>
        </div>
        <div class="mdl-card__supporting-text mdl-color-text--grey-600">
          <!-- Container where we'll display the user details -->
          <div class="user-details-container">
            Firebase sign-in status: <span id="sign-in-status">Unknown</span>
            <div>Firebase auth <code>currentUser</code> object value:</div>
            <pre><code id="account-details">null</code></pre>
          </div>
        </div>
      </div>
    </div>
  </main>
</div>

<!-- Import and configure the Firebase SDK -->
<!-- These scripts are made available when the app is served or deployed on Firebase Hosting -->
<!-- If you do not serve/host your project using Firebase Hosting see https://firebase.google.com/docs/web/setup -->
<script src="/__/firebase/4.0.0/firebase-app.js"></script>
<script src="/__/firebase/4.0.0/firebase-auth.js"></script>
<script src="/__/firebase/init.js"></script>

<script type="text/javascript">
  /**
   * Set up UI event listeners and registering Firebase auth listeners.
   */
  window.onload = function() {
    // Listening for auth state changes.
    firebase.auth().onAuthStateChanged(function(user) {
      if (user) {
        // User is signed in.
        var uid = user.uid;
        var email = user.email;
        var photoURL = user.photoURL;
        var phoneNumber = user.phoneNumber;
        var isAnonymous = user.isAnonymous;
        var displayName = user.displayName;
        var providerData = user.providerData;
        var emailVerified = user.emailVerified;
      }
      updateSignInButtonUI();
      updateSignOutButtonUI();
      updateSignedInUserStatusUI();
    });
    // Event bindings.
    document.getElementById('sign-in-button').addEventListener('click', onSignInClick);
    document.getElementById('sign-out-button').addEventListener('click', onSignOutClick);
  };
  /**
   * Function called when clicking the Login/Logout button.
   */
  function onSignInClick() {
    window.open('/phone-simple-popup.html', '_blank', 'height=600px,width=450px,top=100px,left=100px');
  }
  /**
   * Signs out the user when the sign-out button is clicked.
   */
  function onSignOutClick() {
    firebase.auth().signOut();
  }
  /**
   * Updates the state of the Sign-in form.
   */
  function updateSignInButtonUI() {
    if (firebase.auth().currentUser) {
      document.getElementById('sign-in-button').style.display = 'none';
    } else {
      document.getElementById('sign-in-button').style.display = 'block';
    }
  }
  /**
   * Updates the state of the Sign out button.
   */
  function updateSignOutButtonUI() {
    if (firebase.auth().currentUser) {
      document.getElementById('sign-out-button').style.display = 'block';
    } else {
      document.getElementById('sign-out-button').style.display = 'none';
    }
  }
  /**
   * Updates the Signed in user status panel.
   */
  function updateSignedInUserStatusUI() {
    var user = firebase.auth().currentUser;
    if (user) {
      document.getElementById('sign-in-status').textContent = 'Signed in';
      document.getElementById('account-details').textContent = JSON.stringify(user, null, '  ');
    } else {
      document.getElementById('sign-in-status').textContent = 'Signed out';
      document.getElementById('account-details').textContent = 'null';
    }
  }
</script>
</body>
</html>

来源:https://github.com/firebase/quickstart-js/blob/master/auth/phone-simple.html

必须将其上传到网络服务器。

然后,在您的React Native组件中,您必须按以下方式调用HTML WebView:

      <WebView
        javaScriptEnabled
        domStorageEnabled
        injectedJavaScript={patchPostMessageJsCode}
        source={{uri: 'https://yourServerDomain.com/YourWebViewFile.html'}}
        onMessage={this.signupUser}
      />

所有短信发送和验证都将由HTML处理。

这非常棘手,到我实施时,是我能找到的唯一解决方案。

您可以在官方文档中找到更多详细信息,以查找JavaScript实现:https://firebase.google.com/docs/auth/web/phone-auth

此回购非常有用:https://github.com/firebase/quickstart-js/tree/master/auth

希望有所帮助

答案 1 :(得分:0)

我通过从Firebase身份验证中删除包含相同号码的Facebook帐户来解决此问题。