web-dev-qa-db-fra.com

La connexion Google Flutter Firebase ne fonctionne pas. S'arrête après la sélection du compte

J'essaie actuellement de mettre en œuvre la connexion et l'authentification Google dans mon application. J'ai mis en place un projet et créé une application dans Firebase, mis le google-services.json dans l'application, ajouté le plugin nécessaire à build.gradle et défini la clé SHA-1 dans Firebase. L'authentification par e-mail fonctionne très bien, mais l'authentification Google pose des problèmes.

Toute authentification est effectuée à partir d'un package "d'authentification" que j'ai créé. Il contient une page d'authentification et exécute toute la logique d'authentification. L'application Flutter "principale" qui est exécutée importe ce package pour utilisation. Les fichiers build.gradle de ce projet "principal" contiennent les ajouts pour le plugin google services (com.google.gms:google-services:4.3.2). Une fois que le projet 'principal' est exécuté, il vérifie si l'utilisateur est actuellement connecté. Sinon, il passe le contrôle au package 'authentication' pour afficher un écran d'authentification et gérer la connexion.

Le problème survient après avoir sélectionné le compte Google avec lequel je souhaite me connecter. Une fois le compte sélectionné, la boîte de dialogue de sélection de compte se ferme et rien ne se passe par la suite. L'utilisateur n'est pas authentifié (confirmé dans Firebase), aucune exception n'est levée et le try-catch entourant tout ne détecte aucune exception. Il semble que toute exécution de la fonction s'arrête. Je peux toujours me déplacer dans l'application, mais la méthode de connexion ne termine jamais l'exécution.

Vous pouvez voir la méthode de connexion ci-dessous. Après l'exécution de la ligne final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn(); l'exécution ne continue pas pour une raison quelconque.

///
  Future<String> _signUpWithGoogle() async {
    bool isLoggedIn = await _firebaseAuth.isLoggedIn();
    if (!isLoggedIn) {
      googleSignIn = GoogleSignIn();
      final GoogleSignInAccount googleSignInAccount =
          await googleSignIn.signIn();
      final GoogleSignInAuthentication googleSignInAuthentication =
          await googleSignInAccount.authentication;

      final AuthCredential credential = GoogleAuthProvider.getCredential(
        accessToken: googleSignInAuthentication.accessToken,
        idToken: googleSignInAuthentication.idToken,
      );

      final AuthResult authResult =
          await _firebaseAuth.signInWithCredential(credential);
      final FirebaseUser user = authResult.user;

      assert(!user.isAnonymous);
      assert(await user.getIdToken() != null);

      final FirebaseUser currentUser = await _firebaseAuth.getUser();
      assert(user.uid == currentUser.uid);

      return 'signInWithGoogle succeeded: $user';
    } else {
      FirebaseUser user = await _firebaseAuth.getUser();
      return 'signInWithGoogle succeeded: $user';
    }
  }

Je pense qu'une PlatformException devrait revenir en cas de problème, mais aucune exception n'est renvoyée la première fois. Si je déclenche à nouveau la méthode de connexion google, je reçois une PlatformException qui dit:

PlatformException(error, Concurrent operations detected: signIn, signIn, null)

Ci-dessous, vous pouvez également trouver les dépendances pour l'application `` principale '' et le package `` authentification '':

dépendances d'application `` principales ''

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^0.1.2
  permission:
  intl_translation:
  flutter_svg:
  sqflite:
  path:
  path_provider:
  uuid:
  qr_flutter:
  vibration:
  reflectable:
  provider:
  launcher_module:
    path: ../modules/launcher_module
  individual:
    path: ../modules/individual
  common:
    path: ../packages/common
  persistence:
    path: ../packages/persistence
  resources:
    path: ../packages/resources
  authentication:
    path: ../packages/authentication
  screen:
  flutter_screen_scaler: ^0.0.1
  page_indicator:
  toast: ^0.1.5
  rxbus: ^0.0.2
  shared_preferences:

dépendances du package 'authentication'

dependencies:
  flutter:
    sdk: flutter
  firebase_auth: ^0.15.3+1
  google_sign_in: ^4.1.1
  flutter_facebook_login:
  shared_preferences:
  common: 
    path: "../common"
  toast: ^0.1.5

J'ai également essayé de déplacer toute la logique d'authentification dans l'application principale et de supprimer la référence au package "authentification". Cependant, la même chose se produit toujours.

Y a-t-il quelque chose que je fais mal ou que je manque dans tout cela?

4
magee05

auth.Dart

import 'Dart:io';

import 'package:cloud_firestore/cloud_firestore.Dart';
import 'package:flutter/material.Dart';
import 'package:flutter/services.Dart';
import 'package:firebase_auth/firebase_auth.Dart';
import 'package:fluttertoast/fluttertoast.Dart';
import 'package:google_sign_in/google_sign_in.Dart';
import 'package:shared_preferences/shared_preferences.Dart';

abstract class BaseAuth {

  Future<String> signInWithGoogle();

//optional if you need to store user data
  String name = "User";
  String email = "Demo";
  String imageUrl = "https://celebritypets.net/wp-content/uploads/2016/12/Adriana-Lima.jpg";


}
enum authProblems { UserNotFound, PasswordNotValid, NetworkError }

class Auth implements BaseAuth {

final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
final GoogleSignIn googleSignIn = GoogleSignIn();

  Future<String> signInWithGoogle() async {


  final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
  final GoogleSignInAuthentication googleSignInAuthentication =
      await googleSignInAccount.authentication;

  final AuthCredential credential = GoogleAuthProvider.getCredential(
    accessToken: googleSignInAuthentication.accessToken,
    idToken: googleSignInAuthentication.idToken,
  );

  final AuthResult authResult = await _firebaseAuth.signInWithCredential(credential);
  final FirebaseUser user = authResult.user;

  // Checking if email and name is null
  assert(user.email != null);
  assert(user.displayName != null);
  assert(user.photoUrl != null);

  name = user.displayName;
  email = user.email;
  imageUrl = user.photoUrl;


  // Only taking the first part of the name, i.e., First Name
  if (name.contains(" ")) {
    name = name.substring(0, name.indexOf(" "));
  }

  assert(!user.isAnonymous);
  assert(await user.getIdToken() != null);

  final FirebaseUser currentUser = await _firebaseAuth.currentUser();
  assert(user.uid == currentUser.uid);

  return 'signInWithGoogle succeeded: $user';
}

authprovider.Dart

import 'package:flutter/material.Dart';
import 'package:multitask_flutter/auth.Dart';

class AuthProvider extends InheritedWidget {

  AuthProvider({Key key,Widget child, this.auth}) : super(key: key,child: child);
  final BaseAuth auth;


  @override
  bool updateShouldNotify(InheritedWidget oldWidget) => true;

  static AuthProvider of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<AuthProvider>();
  }

}

loginpage.Dart

import 'package:appname_flutter/authprovider.Dart';
//just call this... when user click on button...

var auth = AuthProvider.of(context).auth;
auth.handleSignIn();

Et vous avez fait ...

J'espère que ça aide.

0
Sunil Varma

Dans mon cas, j'ai ajouté la clé de débogage sha1 à Firebase avant 4 mois, et maintenant j'ai essayé de faire des changements, mais je ne peux pas me connecter.En attendant, j'ai changé le système d'exploitation de mon ordinateur portable, donc ma clé de débogage sha1 est changé automatiquement.

now the required step is to create new debugging key add it to firebase.

Remarque: ce ne sera pas la cause principale dans de nombreux cas, mais quelqu'un pourrait changer son système d'exploitation ou flutter sdk.

0
Rajesh Jr.