¿Cómo comprobé el token de identificación con Firebase y Django Rest?

Simplemente no puedo envolver mi cabeza alrededor de cómo se hace la autenticación si uso Firebase auth y deseo conectarlo a mi backend de reposo django.

Yo uso el getIdTokenResult proporcionada por la base de fuego como tal:

 async login() {
            this.error = null;
            try {
                const response = await firebase.auth().signInWithEmailAndPassword(this.email, this.password);
                const token = await response.user.getIdTokenResult();

                /* 
                  No idea if this part below is correct 
                  Should I create a custom django view for this part?
                */

                 fetch("/account/firebase/", {
                     method: "POST",
                     headers: { 
                         "Content-Type": "application/json", 
                         "HTTP_AUTHORIZATION": token.token,
                     },
                     body: JSON.stringify({ username: this.email, password: this.password }),
                 }).then((response) => response.json().then((data) => console.log(data)));
            } catch (error) {
                this.error = error;
            }
        },

Lo único que encuentro en los docs de la base de fuego es este sinvergüenza de dos líneas: https://firebase.google.com/docs/auth/admin/verify-id-tokens#web

donde escriben

decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']
# wtf, where does this go? 
# what do I do with this? Do I put it in a django View?

Encontré un guía aquí que conecta el descanso django a la base de fuego: https://www.oscaralsing.com/firebase-authentication-in-django/

Pero aún no entiendo cómo está todo atado. Cuando se supone que llame esto FirebaseAuthentication. Cada vez que trato de llamar login Sólo tengo un 403 CSRF verification failed. Request aborted.

Todo esto. FirebaseAuthentication clase proporcionada por la guía que he ligado a arriba - ¿Debería añadir eso como un camino en el backend?

path("firebase/", FirebaseAuthentication, name="api-firebase"),

¿Cuál es el punto final api de mis llamadas de frontend?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por binarybuilder


2 Respuestas:

  • Para autenticar un token de Firebase en Django Rest Framework, puedes hacer lo siguiente:

    • En tu frontend, después de obtener el token de autenticación de Firebase, debes agregarlo en el header de la petición HTTP en lugar de usar `HTTP_AUTHORIZATION`, ya que Django Rest Framework espera el token de autenticación en el header `Authorization`.
    • En tu backend Django, necesitas crear una vista que maneje la verificación del token de Firebase. Puedes usar la biblioteca `firebase_admin` de Firebase para verificar y decodificar el token.
    • Aquí hay un ejemplo de cómo podrías implementar la vista en Django para verificar el token de Firebase:
    python
    from django.http import JsonResponse
    import firebase_admin
    from firebase_admin import auth
    from rest_framework.decorators import api_view
    
    @api_view(['POST'])
    def verify_firebase_token(request):
        

    Obtener el token de Firebase del header de la petición

    id_token = request.headers.get('Authorization').split('Bearer ')[1] try:

    Verificar y decodificar el token de Firebase

    decoded_token = auth.verify_id_token(id_token) uid = decoded_token['uid']

    Realizar cualquier lógica adicional que necesites con el uid

    return JsonResponse({'message': 'Token verified'}, status=200) except auth.AuthError as e: return JsonResponse({'error': str(e)}, status=403)
    • En tu archivo de urls de Django, puedes mapear la vista creada a una ruta específica, por ejemplo:
    python
    from django.urls import path
    from .views import verify_firebase_token
    
    urlpatterns = [
        path('account/firebase/', verify_firebase_token, name='verify-firebase-token'),
    ]
    
    • En tu frontend, asegúrate de enviar las peticiones a la ruta configurada en tu backend para verificar el token de Firebase.

    Recuerda que es importante estar seguro de la implementación de seguridad al verificar tokens de autenticación en tu backend.

    Respondida el Dec 20, 2020 a las 14:27 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Cómo verificar el token de identificación con Firebase y Django Rest

    Para autenticar a los usuarios con Firebase y Django Rest, debes seguir estos pasos:

    1. Obtener el token de identificación de Firebase:

    En tu frontend, usa signInWithEmailAndPassword para iniciar sesión al usuario. Obtén el token de identificación del usuario usando getIdTokenResult().

    2. Verificar el token en Django:

    Crea una vista de Django personalizada en tu backend. Usa la biblioteca django-rest-framework para manejar las solicitudes de verificación de tokens. En la vista, verifica el token utilizando la biblioteca google-auth o firebase-admin.

    3. Permitir solicitudes entre dominios (CORS):

    Configura CORS en tu backend Django para permitir solicitudes desde tu aplicación frontend.

    Código de ejemplo:

    Vista de Django:

    python
    from django.http import JsonResponse
    from django.views.decorators.csrf import csrf_exempt
    from google.oauth2 import id_token
    from google.auth.transport import requests
    
    @csrf_exempt
    def firebase_auth(request):
        

    Obtener el token de identificación de la solicitud

    token = request.headers.get('HTTP_AUTHORIZATION')

    Verificar el token utilizando la biblioteca google-auth

    try: idinfo = id_token.verify_oauth2_token(token, requests.Request()) except Exception as e: return JsonResponse({'error': str(e)}, status=401)

    Obtener el uid del usuario del token verificado

    uid = idinfo['sub']

    Crear o recuperar al usuario en la base de datos de Django

    ...

    Devolver una respuesta exitosa

    return JsonResponse({'success': True})

    URL de backend:

    
    path("firebase/", firebase_auth, name="api-firebase"),
    

    Punto final API de la aplicación frontend:

    javascript
    fetch("/account/firebase/", {
        method: "POST",
        headers: { 
            "Content-Type": "application/json", 
            "HTTP_AUTHORIZATION": token.token,
        },
        body: JSON.stringify({ username: this.email, password: this.password }),
    });
    

    Consideraciones:

    El token de identificación debe establecerse en el encabezado HTTP_AUTHORIZATION de la solicitud al backend. Asegúrate de que el dominio de tu aplicación frontend esté incluido en la lista de dominios permitidos en la configuración de CORS de Django. * Utiliza un entorno seguro (HTTPS) para la comunicación entre tu aplicación frontend y el backend.

    Respondida el Dec 20, 2020 a las 14:36 - por Gemini

    Votos positivos: 0 | Votos negativos: 0