1

我正在使用flutter_auth包来应用Phone Auth。通常它会在注册新电话号码时发送OTP 。但是它一次又一次地发送OTP,尽管用户的电话号码在那里Firebase authentication list

另一件事是它在少数设备上运行良好,这是正常的方式。同步问题有什么问题吗?意味着与firestore同步是否需要一些时间?

这是我在做什么错的代码phone auth

phoneAuth(String phone) async {
      FirebaseAuth _auth = FirebaseAuth.instance;

      _auth.verifyPhoneNumber(
          phoneNumber: phone,
          timeout: Duration(seconds: 60),
          verificationCompleted: (AuthCredential credential) async {
            Navigator.pop(context);
            AuthResult authResult =
                await _auth.signInWithCredential(credential);

            FirebaseUser user = authResult.user;

            if (user != null) {
              Navigator.push(
                  context,
                  new MaterialPageRoute(
                      builder: (context) => AddContacts(
                            user: user,
                          )));
            } else {
              print("ERROR");
            }
          },
          verificationFailed: (AuthException exception) {
            Toast.show('Try Again Later', context,
                backgroundColor: Colors.red,
                duration: 3,
                gravity: Toast.BOTTOM);
          },
          codeSent: (String verification, [int forceResendingToken]) {
            showDialog(
                context: context,
                barrierDismissible: false,
                builder: (context) {
                  return AlertDialog(
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(12)),
                    title: Text('Enter 6-Digit Code'),
                    content: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: <Widget>[
                        TextField(
                          controller: _controllerCode,
                          keyboardType: TextInputType.number,
                          maxLength: 6,
                          decoration: InputDecoration(
                            errorText: validateCode(_controllerCode.text),
                            hintText: 'Enter Code',
                            enabledBorder: OutlineInputBorder(
                                borderRadius: BorderRadius.circular(12.0)),
                            focusedBorder: OutlineInputBorder(
                                borderRadius: BorderRadius.circular(12.0)),
                            errorBorder: OutlineInputBorder(
                                borderRadius: BorderRadius.circular(12.0),
                                borderSide: BorderSide(color: Colors.red)),
                            focusedErrorBorder: OutlineInputBorder(
                                borderRadius: BorderRadius.circular(12.0),
                                borderSide: BorderSide(color: Colors.red)),
                          ),
                        )
                      ],
                    ),
                    actions: <Widget>[
                      Text(
                        "Wait for Automatic Detection!",
                        style: TextStyle(fontSize: 10, color: Colors.red),
                      ),
                      FlatButton(
                        padding: EdgeInsets.symmetric(horizontal: width * .05),
                        shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(12)),
                        child: Text("Confirm"),
                        textColor: Colors.white,
                        color: Colors.lightBlue,
                        onPressed: () async {
                          setState(() {
                            _controllerCode.text.isEmpty
                                ? _validateCode = true
                                : _validateCode = false;
                          });
                          final code = _controllerCode.text.trim();
                          AuthCredential credential =
                              PhoneAuthProvider.getCredential(
                                  verificationId: verification, smsCode: code);
                          AuthResult result =
                              await _auth.signInWithCredential(credential);
                          FirebaseUser user = result.user;
                          if (user != null) {
                            Navigator.push(
                                context,
                                new MaterialPageRoute(
                                    builder: (context) => AddContacts(
                                          user: user,
                                        )));
                          } else {
                            Toast.show("ERROR: Code mismatch!", context,
                                backgroundColor: Colors.red,
                                gravity: Toast.TOP);
                          }
                        },
                      )
                    ],
                  );
                });
          },
          codeAutoRetrievalTimeout: null);
    }
4

1 回答 1

2

正如我们在LinkedIn上私下讨论的问题。我们达到了您的问题的重点,即-正如您所说..

OTP 应该只在用户第一次登录时发送,而不是之后发送。如果我在另一台设备上输入我的号码,它会再次发送 OTP

因此,您在理解 Auth OTP 的工作方式时遇到了问题。

即使您已经在另一台设备上注册或登录,每次您请求时都会发送 OTP 代码。

然后你问..

意味着无论用户已经登录还是新登录,它都会发送 OTP?

答案是肯定的,它会的。所以你的代码现在工作正常。这都是关于它如何工作的概念。

于 2020-04-01T15:04:31.703 回答