Hoy vamos a aprender cómo podemos implementar la autenticación con Google en nuestra APP de Flutter.
Vamos a Google Cloud Platform (https://cloud.google.com/) y pulsamos en Consola
Ahora seleccionamos nuestro proyecto (si ya lo tenemos creado por Firebase) o creamos uno nuevo.
Ahora buscamos: oauth clients
Elegimos External:
Rellenamos el nombre de la aplicación y los datos solicitados:
Después rellenamos Información de contacto del desarrollador:
Pulsamos en guardar y continuar.
En la siguiente pantalla no tocamos nada y volvemos a pulsar en guardar y continuar.
Lo mismo para la información opcional.
Ahora tenemos que añadir las claves permitidas, para ello vamos a Credenciales
Pulsamos en Crear Credenciales y Elegimos ID de cliente de OAuth
Elegimos tipo Android.
Añadimos el id de paquete que lo podemos encontrar en Android/app/build.gradle
Añadimos la clave SHA1 con el comando.
cd android ./gradlew signingReport
Y nos devolverá la clave o claves que tengamos configuradas.
Tendremos que añadir la de debug y también release (si la tienes) (Aquí te indico cómo puedes crear una https://devcodelight.com/generar-un-apk-aab-release-con-flutter-y-visual-stuido-code/), si no tienes la de release, no importa, puedes probar primero con debug.
Copiamos la salida que pone SHA1:
Ahora se añade el código de Flutter:
- Ir a pubspec-yaml y añadir la dependencia:
google_sign_in: ^6.2.1
2. Crear el Widget que maneja el login Google:
import 'dart:convert'; import 'dart:async'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart' show kIsWeb; import '../../componentes/Boton_juego.dart'; import '../../internacionalizacion/AppLocalizations.dart'; import '../../utils/Constantes/Colors.dart'; const List<String> scopes = <String>['email']; GoogleSignIn _googleSignIn = GoogleSignIn( scopes: scopes, ); class LoginGoogle extends StatefulWidget { const LoginGoogle({Key? key}); @override State createState() => _LoginGoogle(); } class _LoginGoogle extends State<LoginGoogle> { GoogleSignInAccount? _currentUser; bool _isAuthorized = false; String _contactText = ''; @override void initState() { super.initState(); _googleSignIn.onCurrentUserChanged .listen((GoogleSignInAccount? account) async { bool isAuthorized = account != null; if (kIsWeb && account != null) { isAuthorized = await _googleSignIn.canAccessScopes(scopes); } setState(() { _currentUser = account; _isAuthorized = isAuthorized; }); if (isAuthorized) { //Obten el email print("Email: " + account!.email); //Obten el nombre print("Nombre: " + account.displayName!); //Obten la foto print("Foto: " + account.photoUrl!); //Obten el id print("Id: " + account.id); //Obten el token final GoogleSignInAuthentication auth = await account.authentication; print("Token: " + auth.accessToken!); //OAuth Token print("OAuth Token: " + (auth.idToken ?? "")); } }); _googleSignIn.signInSilently(); } Future<void> _handleSignIn() async { try { await _googleSignIn.signIn(); } catch (error) { print('Error during Google Sign-In: $error'); } } Future<void> _handleSignOut() async { if (_googleSignIn.currentUser != null) { await _googleSignIn.disconnect(); } } @override Widget build(BuildContext context) { return TextButton( style: TextButton.styleFrom( backgroundColor: ColorsApp.blanco, elevation: 5, shadowColor: ColorsApp.rojo, minimumSize: Size.fromWidth(150), // Ajusta el ancho mínimo según tus necesidades ), onPressed: () { _handleSignIn(); }, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.g_mobiledata, color: ColorsApp.rojo, ), SizedBox(width: 8), Text( Traducir.of(context)!.translate("login.login_google"), style: TextStyle(color: ColorsApp.rojo), ), ], ), ); } }
Importante: este es el token que debemos validar con el back:
print("OAuth Token: " + (auth.idToken ?? ""));
Recuerda añadir el código en:
GoogleSignIn _googleSignIn = GoogleSignIn( clientId: 'your_app_id.apps.googleusercontent.com', scopes: scopes, );
Para mostrar el botón de inicio de sesión:
LoginGoogle(),
Importante, una vez creado el código Dart, tenemos que modificar la carpeta android.
Para ello vamos a android/build.gradle y añadimos:
dependencies { ... classpath 'com.google.gms:google-services:4.3.8' }
Quedando de esta forma:
Y ahora vamos a android/app/build.gradle y añadimos:
apply plugin: 'com.google.gms.google-services'
Quedando de esta forma:
Luego tenemos que configurar iOS, para ello vamos al archivo info.plist y añadimos:
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>com.googleusercontent.apps.YOUR_CLIENT_ID</string> </array> </dict> </array>
Indicando correctamente el Client ID: com.googleusercontent.apps.YOUR_CLIENT_ID
Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.
1 comentario en «Añadir Google Sign Auth en Flutter»