Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Flatter中的Firebase电话认证_Flutter_Firebase Authentication - Fatal编程技术网

Flutter Flatter中的Firebase电话认证

Flutter Flatter中的Firebase电话认证,flutter,firebase-authentication,Flutter,Firebase Authentication,为了实现firebase电话验证,我遵循了颤振火灾文档。我在firebase_auth(firebase_auth:0.14.0+5)的早期版本中尝试了这一点,一切似乎都正常,但我启动了一个新的应用程序,并安装了最新版本的firebase_auth(firebase_auth:0.18.1+2),每当我调用firebase verifyNumber方法时,我的应用程序都会出现以下日志: E/zza (12630): Problem retrieving SafetyNet Token:

为了实现firebase电话验证,我遵循了颤振火灾文档。我在firebase_auth
(firebase_auth:0.14.0+5)的早期版本中尝试了这一点,一切似乎都正常,但我启动了一个新的应用程序,并安装了最新版本的firebase_auth
(firebase_auth:0.18.1+2)
,每当我调用firebase verifyNumber方法时,我的应用程序都会出现以下日志:

E/zza     (12630): Problem retrieving SafetyNet Token: 7: 
D/ViewRootImpl@bab4cc4[MainActivity](12630): MSG_WINDOW_FOCUS_CHANGED 0
W/zzdq    (12630): keyset not found, will generate a new one
W/zzdq    (12630): java.io.FileNotFoundException: can't read keyset; the pref value GenericIdpKeyset does not exist
W/zzdq    (12630):  at com.google.android.gms.internal.firebase-auth-api.zzdv.zzc(com.google.firebase:firebase-auth@@20.0.0:13)
W/zzdq    (12630):  at com.google.android.gms.internal.firebase-auth-api.zzdv.zzb(com.google.firebase:firebase-auth@@20.0.0:32)
W/zzdq    (12630):  at com.google.android.gms.internal.firebase-auth-api.zzbd.zza(com.google.firebase:firebase-auth@@20.0.0:8)
W/zzdq    (12630):  at com.google.android.gms.internal.firebase-auth-api.zzdq$zza.zzd(com.google.firebase:firebase-auth@@20.0.0:73)
W/zzdq    (12630):  at com.google.android.gms.internal.firebase-auth-api.zzdq$zza.zzc(com.google.firebase:firebase-auth@@20.0.0:60)
W/zzdq    (12630):  at com.google.android.gms.internal.firebase-auth-api.zzdq$zza.zza(com.google.firebase:firebase-auth@@20.0.0:27)
W/zzdq    (12630):  at com.google.firebase.auth.internal.zzi.<init>(com.google.firebase:firebase-auth@@20.0.0:9)
W/zzdq    (12630):  at com.google.firebase.auth.internal.zzi.zza(com.google.firebase:firebase-auth@@20.0.0:17)
W/zzdq    (12630):  at com.google.firebase.auth.internal.RecaptchaActivity.zza(com.google.firebase:firebase-auth@@20.0.0:116)
W/zzdq    (12630):  at com.google.firebase.auth.api.internal.zzeq.<init>(com.google.firebase:firebase-auth@@20.0.0:14)
W/zzdq    (12630):  at com.google.firebase.auth.internal.RecaptchaActivity.onResume(com.google.firebase:firebase-auth@@20.0.0:78)
W/zzdq    (12630):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1277)
W/zzdq    (12630):  at android.app.Activity.performResume(Activity.java:7088)
W/zzdq    (12630):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3768)
W/zzdq    (12630):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3832)
W/zzdq    (12630):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2994)
W/zzdq    (12630):  at android.app.ActivityThread.-wrap14(ActivityThread.java)
W/zzdq    (12630):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
W/zzdq    (12630):  at android.os.Handler.dispatchMessage(Handler.java:102)
W/zzdq    (12630):  at android.os.Looper.loop(Looper.java:154)
W/zzdq    (12630):  at android.app.ActivityThread.main(ActivityThread.java:6682)
W/zzdq    (12630):  at java.lang.reflect.Method.invoke(Native Method)
W/zzdq    (12630):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
W/zzdq    (12630):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
I/zzip    (12630): Provider GmsCore_OpenSSL not available
I/System.out(12630): (HTTPLog)-Static: isSBSettingEnabled false
I/System.out(12630): (HTTPLog)-Static: isSBSettingEnabled false
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630): ThreadedRenderer.create() translucent=true
D/InputTransport(12630): Input channel constructed: fd=95
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630): setView = DecorView@7954fc2[RecaptchaActivity] touchMode=true
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630): dispatchAttachedToWindow
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630): Relayout returned: oldFrame=[0,0][0,0] newFrame=[0,0][1440,2560] result=0x27 surface={isValid=true 501132826624} surfaceGenerationChanged=true
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630): mHardwareRenderer.initialize() mSurface={isValid=true 501132826624} hwInitialized=true
D/mali_winsys(12630): EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000,  [1440x2560]-format:1
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630): MSG_RESIZED_REPORT: ci=Rect(0, 96 - 0, 0) vi=Rect(0, 96 - 0, 0) or=1
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630): MSG_WINDOW_FOCUS_CHANGED 1
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630): mHardwareRenderer.initializeIfNeeded()#2 mSurface={isValid=true 501132826624}
V/InputMethodManager(12630): Starting input: tba=android.view.inputmethod.EditorInfo@46ca60e nm : com.example.harpy ic=null
I/InputMethodManager(12630): [IMM] startInputInner - mService.startInputOrWindowGainedFocus
D/InputTransport(12630): Input channel constructed: fd=101
D/InputTransport(12630): Input channel destroyed: fd=93
W/IInputConnectionWrapper(12630): finishComposingText on inactive InputConnection
D/AndroidRuntime(12630): Shutting down VM
E/AndroidRuntime(12630): FATAL EXCEPTION: main
E/AndroidRuntime(12630): Process: com.example.harpy, PID: 12630
E/AndroidRuntime(12630): java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/browser/customtabs/CustomTabsIntent$Builder;
E/AndroidRuntime(12630):    at com.google.firebase.auth.internal.RecaptchaActivity.zza(com.google.firebase:firebase-auth@@20.0.0:92)
E/AndroidRuntime(12630):    at com.google.firebase.auth.api.internal.zzeq.zza(com.google.firebase:firebase-auth@@20.0.0:79)
E/AndroidRuntime(12630):    at com.google.firebase.auth.api.internal.zzeq.onPostExecute(com.google.firebase:firebase-auth@@20.0.0:88)
E/AndroidRuntime(12630):    at android.os.AsyncTask.finish(AsyncTask.java:660)
E/AndroidRuntime(12630):    at android.os.AsyncTask.-wrap1(AsyncTask.java)
E/AndroidRuntime(12630):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)
E/AndroidRuntime(12630):    at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(12630):    at android.os.Looper.loop(Looper.java:154)
E/AndroidRuntime(12630):    at android.app.ActivityThread.main(ActivityThread.java:6682)
E/AndroidRuntime(12630):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(12630):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
E/AndroidRuntime(12630):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
E/AndroidRuntime(12630): Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.browser.customtabs.CustomTabsIntent$Builder" on path: DexPathList[[zip file "/data/app/com.example.harpy-1/base.apk"],nativeLibraryDirectories=[/data/app/com.example.harpy-1/lib/arm64, /data/app/com.example.harpy-1/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
E/AndroidRuntime(12630):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
E/AndroidRuntime(12630):    at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
E/AndroidRuntime(12630):    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
E/AndroidRuntime(12630):    ... 12 more
Lost connection to device.

E/zza(12630):检索安全网令牌时出现问题:7:
D/ViewRootImpl@bab4cc4[MainActivity](12630):消息窗口焦点已更改0
W/zzdq(12630):未找到密钥集,将生成一个新密钥集
W/zzdq(12630):java.io.FileNotFoundException:无法读取密钥集;pref值GenericDipKeyset不存在
W/zzdq(12630):位于com.google.android.gms.internal.firebase auth api.zzdv.zzc(com.google.firebase:firebase auth@@20.0.0:13)
W/zzdq(12630):位于com.google.android.gms.internal.firebase auth api.zzdv.zzb(com.google.firebase:firebase auth@@20.0.0:32)
W/zzdq(12630):位于com.google.android.gms.internal.firebase auth api.zzbd.zza(com.google.firebase:firebase auth@@20.0.0:8)
W/zzdq(12630):位于com.google.android.gms.internal.firebase auth api.zzdq$zza.zzd(com.google.firebase:firebase auth@@20.0.0:73)
W/zzdq(12630):位于com.google.android.gms.internal.firebase auth api.zzdq$zza.zzc(com.google.firebase:firebase auth@@20.0.0:60)
W/zzdq(12630):位于com.google.android.gms.internal.firebase auth api.zzdq$zza.zza(com.google.firebase:firebase auth@@20.0.0:27)
W/zzdq(12630):位于com.google.firebase.auth.internal.zzi.(com.google.firebase:firebase auth@@20.0.0:9)
W/zzdq(12630):位于com.google.firebase.auth.internal.zzi.zza(com.google.firebase:firebase auth@@20.0.0:17)
W/zzdq(12630):位于com.google.firebase.auth.internal.RecaptchaActivity.zza(com.google.firebase:firebase auth@@20.0.0:116)
W/zzdq(12630):位于com.google.firebase.auth.api.internal.zzeq.(com.google.firebase:firebase auth@@20.0.0:14)
W/zzdq(12630):位于com.google.firebase.auth.internal.RecaptchaActivity.onResume(com.google.firebase:firebase auth@@20.0.0:78)
W/zzdq(12630):位于android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1277)
W/zzdq(12630):位于android.app.Activity.performResume(Activity.java:7088)
W/zzdq(12630):位于android.app.ActivityThread.performResumeActivity(ActivityThread.java:3768)
W/zzdq(12630):位于android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3832)
W/zzdq(12630):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2994)
W/zzdq(12630):位于android.app.ActivityThread.-wrap14(ActivityThread.java)
W/zzdq(12630):位于android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
W/zzdq(12630):位于android.os.Handler.dispatchMessage(Handler.java:102)
W/zzdq(12630):位于android.os.Looper.loop(Looper.java:154)
W/zzdq(12630):位于android.app.ActivityThread.main(ActivityThread.java:6682)
W/zzdq(12630):位于java.lang.reflect.Method.invoke(本机方法)
W/zzdq(12630):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
W/zzdq(12630):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
I/zzip(12630):提供程序GmsCore_OpenSSL不可用
I/System.out(12630):(HTTPLog)-静态:isSBSettingEnabled false
I/System.out(12630):(HTTPLog)-静态:isSBSettingEnabled false
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630):ThreadedRenderer.create()半透明=true
D/InputTransport(12630):构建的输入通道:fd=95
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630):设置视图=DecorView@7954fc2[RecaptchaActivity]触摸模式=真
D/ViewRootImpl@9c9340d[回顾活动](12630):发送附件Towindow
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630):重新发布返回:oldFrame=[0,0][0,0]newFrame=[0,0][14402560]结果=0x27曲面={isValid=true 501132826624}曲面GenerationChanged=true
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630):mHardwareRenderer.initialize()mSurface={isValid=true 501132826624}hwInitialized=true
D/mali_winsys(12630):EGLint新窗口曲面(egl_winsys_display*,void*,EGLSurface,EGLConfig,egl_winsys_surface**,egl_color_buffer_format*,EGLBoolean)返回0x3000,[1440x2560]-格式:1
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630):调整大小的消息报告:ci=Rect(0,96-0,0)vi=Rect(0,96-0,0)或=1
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630):消息窗口焦点已更改1
D/ViewRootImpl@9c9340d[RecaptchaActivity](12630):mHardwareRenderer.initializeIfNeeded()#2 mSurface={isValid=true 501132826624}
V/InputMethodManager(12630):开始输入:tba=android.view.inputmethod。EditorInfo@46ca60enm:com.example.harpy ic=null
I/InputMethodManager(12630):[IMM]startInputInner-MSService.StartInputWindowGainedFocus
D/InputTransport(12630):构建的输入通道:fd=101
D/InputTransport(12630):输入通道已破坏:fd=93
W/IIInputConnectionWrapper(12630):在非活动InputConnection上完成合成文本
D/AndroidRuntime(12630):关闭虚拟机
E/AndroidRuntime(12630):致命异常:主
E/AndroidRuntime(12630):进程:com.example.harpy,PID:12630
E/AndroidRuntime(12630):java.lang.NoClassDefFoundError:未能解析:Landroidx/browser/customtabs/customtabsinent$Builder;
E/AndroidRuntime(12630):位于com.google.firebase.auth.internal.RecaptchaActivity.zza(com.google.firebase:firebase auth@@20.0.0:92)
E/AndroidRuntime(12630):位于com.google.firebase.auth.api.internal.zzeq.zza(com.google.firebase:firebase auth@@20.0.0:79)
E/AndroidRuntime(12630):位于com.google.firebase.auth.api.internal.zzeq.onPostExecute(com.google.firebase:firebase auth@@20.0.0:88)
E/AndroidRuntime(12630):位于android.os.AsyncTask.finish(AsyncTask.java:660)
E/AndroidRuntime(12630):位于android.os.AsyncTask.-wrap1(AsyncTask.java)
E/AndroidRuntime(12630):位于android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)
E/AndroidRuntime(12630):
import 'dart:async';

import 'package:cloud_functions/cloud_functions.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:harpy/providers/AuthenticationProvider.provider.dart';
import 'package:harpy/services/AuthRoute.service.dart';
import 'package:harpy/types/Response.type.dart';
import 'package:provider/provider.dart';

class AuthService{
  FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  final HttpsCallable createUser = CloudFunctions.instance.getHttpsCallable(functionName: 'createUser');
  String verificationId;
  AuthRoute _authRoute = AuthRoute();


  Future<void> validatePhoneNumberWithOTP(BuildContext context, String code) async{
    Provider.of<AuthenticationProvider>(context, listen: false).loading = true;
    // final AuthCredential authCredential = PhoneAuthProvider.getCredential(verificationId: this.verificationId, smsCode: code);
    final AuthCredential authCredential = PhoneAuthProvider.credential(verificationId: this.verificationId, smsCode: code);

    // final AuthResult _userCredential = await _firebaseAuth.signInWithCredential(authCredential);
    final UserCredential _userCredential = await _firebaseAuth.signInWithCredential(authCredential);
    Provider.of<AuthenticationProvider>(context, listen: false).loading = false;
    if(_userCredential.user != null){
      Provider.of<AuthenticationProvider>(context, listen: false).userIsVerified = true;
      //route here
    }else{
      Provider.of<AuthenticationProvider>(context, listen: false).userIsVerified = false;
      //TODO: show snackbar
      print("Enter the correct PIN");
    }

  }

  initAuth({BuildContext context, String phoneNumber}) async {
    Provider.of<AuthenticationProvider>(context, listen: false).loading = true;

    final PhoneVerificationCompleted verificationCompleted = (AuthCredential phoneAuthCredential) async {
      Provider.of<AuthenticationProvider>(context, listen: false).loading = true;
      // final AuthResult authResult = await _firebaseAuth.signInWithCredential(phoneAuthCredential);
      final UserCredential authResult = await _firebaseAuth.signInWithCredential(phoneAuthCredential);
      if(authResult.user != null){
        Provider.of<AuthenticationProvider>(context, listen: false).loading = false;
        Provider.of<AuthenticationProvider>(context, listen: false).userIsVerified = true;
      }
    };

    // final PhoneVerificationFailed verificationFailed = (AuthException authException) {
    final PhoneVerificationFailed verificationFailed = (FirebaseAuthException authException) {
      //TODO: handle verification failed exceptions
      print('Auth Exception is ${authException.message}');
    };

    final PhoneCodeSent codeSent = (String verificationId, [int forceResendingToken]) async {
      Provider.of<AuthenticationProvider>(context, listen: false).loading = false;
      Provider.of<AuthenticationProvider>(context, listen: false).codeSent = true;
      this.verificationId = verificationId;
    };

    final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout = (String verificationId) {
      //TODO: handle timeouts
      this.verificationId = verificationId;
    };

    await _firebaseAuth.verifyPhoneNumber(
        phoneNumber: phoneNumber,
        verificationCompleted: verificationCompleted,
        verificationFailed: verificationFailed,
        codeSent: codeSent,
        codeAutoRetrievalTimeout: codeAutoRetrievalTimeout,
        timeout: Duration(seconds: 60)
    );

  }

  Future<Response> updateUserprofile({context, String name,String email}) async{

    User _user = _firebaseAuth.currentUser;
    Response response = Response(success: false);
    Provider.of<AuthenticationProvider>(context, listen: false).loading = true;

    try{

      HttpsCallableResult functionResponse  = await createUser.call({'displayName': name, 'email':email, 'phoneNumber': _user.phoneNumber});
      response.success = functionResponse.data['success'];
      response.message = functionResponse.data['message'];

      _user.updateProfile(displayName: name);
      // _user.updateEmail(email);

      AuthCredential credential = AuthCredential(providerId: PhoneAuthProvider.PROVIDER_ID, signInMethod: PhoneAuthProvider.PHONE_SIGN_IN_METHOD);
      await _user.reauthenticateWithCredential(credential);

      _user.reload();

      Provider.of<AuthenticationProvider>(context, listen: false).loading = false;

      return response;
    }catch(e){
      Provider.of<AuthenticationProvider>(context, listen: false).loading = false;
      response.message = e.message;
      return response;
    }
  }

  signOut(BuildContext context) async{
    await _firebaseAuth.signOut();
    _authRoute.route(context);
  }
}