**Saya tidak menjelaskan cara membuat project di Firebase

Solusi

  • Saya memiliki method signInWithGoogle seperti berikut:
dart
        
  ...
  
  Future<UserCredential?> signInWithGoogle() async {
    try {
      final GoogleSignInAccount? googleUser = await _googleSignIn.signIn();
      
      if (googleUser == null) {
        return null;
      }

      final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
      final OAuthCredential credential = GoogleAuthProvider.credential(
        accessToken: googleAuth.accessToken,
        idToken: googleAuth.idToken,
      );

      return await _auth.signInWithCredential(credential);
    } on FirebaseAuthException catch (e) {
      throw _handleAuthException(e);
    }
  }

  ...
      
  • Kemudian di event button login dengan Google:
dart
        
  ...
  
  onPressed: () async {
    final currentContext = context;

    final userCredential = await AuthService().signInWithGoogle();
    if (userCredential != null) {
      final user = userCredential.user;
      final idToken = await user!.getIdToken();

      // send user data to backend
      final response = await http.post(
        Uri.parse('${dotenv.env['API_URL']}/api/v1/auth/google-login'), // url backend
        headers: {'Content-Type': 'application/json'},
        body: json.encode({
          'id_token': idToken,
        }),
      );

      if (currentContext.mounted) {
        if (response.statusCode == 200) {
          authService.setUserCredential(userCredential);
          // redirect to home
          Navigator.of(context).pushReplacementNamed('/home');
        } else {
          // show error message
          ScaffoldMessenger.of(context).showSnackBar(
            const SnackBar(
              content: Text('Login failed. Please try again.'),
            ),
          );
        }
      }
    }
  }
  ...
      
  • Sedangkan di server Django saya, saya menggunakan library google-auth untuk memvalidasi token Firebase:
python
        
from google.oauth2 import id_token
from google.auth.transport import requests
import json
import random
from .models import Akun

...

def google_login(request):
    data = json.loads(request.body)
    token = data['id_token']

    try:
        # CLIENT_ID = 'xxxx.apps.googleusercontent.com'
        # idinfo = id_token.verify_oauth2_token(token, requests.Request(), CLIENT_ID)
        idinfo = id_token.verify_firebase_token(token, requests.Request())

        email = idinfo['email']
        username = idinfo['name']

        user, created = Akun.objects.get_or_create(
            email_akun=email,
            defaults={
                'akun_id': random.randint(10**10, 10**11 - 1),
                'username': username,
                'masuk_dengan': 'GOOGLE',
                'status_aktif': True
            }
        )
      
  • bagian yang diberi komentar adalah kode yang saya dapatkan dari AI, tapi tidak bekerja. Cukup lama saya mencari solusi dan akhirnya saya menemukan solusi dari referensi. Saya mengganti id_token.verify_oauth2_token menjadi id_token.verify_firebase_token dan berhasil. Jadi untuk token yang didapatkan dari Firebase, kita harus menggunakan verify_firebase_token bukan verify_oauth2_token.

Referensi

https://github.com/googleapis/google-auth-library-python/issues/316#issuecomment-667777124