Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

SDK de administración para la guía de migración de Python 3.0.0

La versión 3.0.0 del SDK de administración de Firebase para Python presenta algunos cambios importantes en la API. Principalmente, los cambios de API en esta versión son adiciones y mejoras en el manejo de errores para Auth, FCM y otras características de Firebase.

Cambios generales en el manejo de errores

Se han eliminado los siguientes tipos de excepciones:

  • auth.AuthError
  • db.ApiCallError
  • instance_id.ApiCallError
  • messaging.ApiCallError
  • project_management.ApiCallError

En su lugar, se introdujo un nuevo módulo firebase_admin.exceptions . Las API públicas en los módulos auth , db , instance_id , project_management messaging generan instancias de exceptions.FirebaseError .

# Before
from firebase_admin import messaging

try:
    messaging.send(build_message())
except messaging.ApiCallError as ex:
    print('Error message:', ex)

# v3
from firebase_admin import exceptions
from firebase_admin import messaging

try:
    messaging.send(build_message())
except exceptions.FirebaseError as ex:
    print('Error message:', ex)
    print('Error code:', ex.code) # Platform-wide error code
    print('HTTP response:', ex.http_response) # requests HTTP response object

El tipo exceptions.FirebaseError tiene muchos subtipos. Las API públicas en Admin SDK solo pueden generar estos subtipos. Por lo tanto, puede escribir código que detecte un subtipo específico y maneje los errores de forma más granular. Por ejemplo:

try:
    messaging.send(build_message())
except exceptions.InvalidArgumentError as ex:
    print(ex) # One or more arguments were invalid
except exceptions.UnavailableError as ex:
    print(ex) # FCM service is temporarily down
except exceptions.FirebaseError as ex:
    print(ex) # All other errors

En lugar de detectar tipos de errores específicos, también es posible detectar el tipo principal de FirebaseError y comparar los códigos de error.

try:
    messaging.send(build_message())
except exceptions.FirebaseError as ex:
    if ex.code == exceptions.INVALID_ARGUMENT:
        print(ex) # One or more arguments were invalid
    elif ex.code == exceptions.UNAVAILABLE:
        print(ex) # FCM service is temporarily down
    else:
        print(ex) # All other errors

Cada módulo puede declarar subtipos adicionales que se extiendan desde el tipo principal exceptions.FirebaseError (ver más abajo).

Pauta general para el manejo de errores: captura exceptions.FirebaseError cuando no necesitas diferenciar entre condiciones de error. Busque una subclase de error más específica o un código de error cuando necesite diferenciar las condiciones de error.

Cambios en el manejo de errores de autenticación

Verificación JWT

El método auth.verify_id_token() ya no genera ValueError para indicar errores de validación de token. En su lugar, obtendrá uno de los siguientes tipos de error:

  • InvalidIdTokenError
  • ExpiredIdTokenError
  • RevokedIdTokenError

El tipo InvalidIdTokenError extiende el exceptions.InvalidArgumentError , que a su vez extiende el exceptions.FirebaseError . ExpiredIdTokenError y RevokedIdTokenError amplían InvalidIdTokenError .

# Before
from firebase_admin import auth

try:
    auth.verify_id_token(id_token, check_revoked=True)
except ValueError as ex:
    print('Error message:', ex)

 # v3
from firebase_admin import auth

# Coarse-grained error handling
try:
    auth.verify_id_token(id_token, check_revoked=True)
except auth.InvalidIdTokenError as ex:
    print('ID token is invalid, expired or revoked')

# Fine-grained error handling
try:
    auth.verify_id_token(id_token, check_revoked=True)
except auth.RevokedIdTokenError as ex:
    print('ID token has been revoked')
except auth.ExpiredIdTokenError as ex:
    print('ID token is expired')
except auth.InvalidIdTokenError as ex:
    print('ID token is invalid')

De manera similar, el método auth.verify_session_cookie() genera los siguientes tipos de excepción:

  • InvalidSessionCookieError
  • ExpiredSessionCookieError
  • RevokedSessionCookieError

La jerarquía de clases y la semántica son similares a la API verify_id_token() .

Fichas personalizadas

La API create_custom_token() genera auth.TokenSignError en lugar de ValueError para indicar fallas.

# Before
from firebase_admin import auth

try:
    auth.create_custom_token(uid)
except ValueError as ex:
    print('Error message:', ex)

 # v3
from firebase_admin import auth

try:
    auth.create_custom_token(uid)
except auth.TokenSignError as ex:
    print('Error message:', ex)

Gestión de usuarios

Se han introducido los siguientes tipos de errores nuevos en el módulo de auth :

  • EmailAlreadyExistsError
  • InvalidDynamicLinkDomainError
  • PhoneNumberAlreadyExistsError
  • UidAlreadyExistsError
  • UnexpectedResponseError
  • UserNotFoundError
# Before
from firebase_admin import auth

try:
    auth.get_user(uid)
except auth.AuthError as ex:
    if ex.code == auth.USER_NOT_FOUND_ERROR:
        print('Specified user does not exist')
    else:
        print('Something else went wrong')

 # v3
from firebase_admin import auth
from firebase_admin import exceptions

try:
    auth.get_user(uid)
except auth.UserNotFoundError as ex:
    print('Specified user does not exist')
except exceptions.FirebaseError as ex:
    print('Something else went wrong')

Cambios en el manejo de errores de FCM

Los siguientes nuevos tipos de error se han introducido en el módulo de messaging .

  • QuotaExceededError
  • SenderIdMismatchError
  • ThirdPartyAuthError
  • UnregisteredError
# Before
from firebase_admin import messaging

try:
    messaging.send(msg)
except messaging.ApiCallError as ex:
    if ex.code == 'registration-token-not-registered':
        print('Registration token has been unregistered')
    elif ex.code == 'invalid-argument':
        print('One or more arguments invalid')
    else:
        print('Something else went wrong')

# v3
from firebase_admin import exceptions
from firebase_admin import messaging

try:
    messaging.send(msg)
except messaging.UnregisteredError as ex:
    print('Registration token has been unregistered')
except exceptions.InvalidArgumentError as ex:
    print('One or more arguments invalid')
except exceptions.FirebaseError as ex:
    print('Something else went wrong')

Eliminación de propiedad de usuario

Ya no es posible eliminar las propiedades display_name , photo_url , phone_number y custom_claims configurándolas en None . Establecer estos en None deja estas propiedades sin cambios. Deben establecerse explícitamente en auth.DELETE_ATTRIBUTE para eliminarlos.

# Before
from firebase_admin import auth

auth.update_user(uid, display_name=None, photo_url=None)

 # v3
from firebase_admin import auth

auth.update_user(
  uid, display_name=auth.DELETE_ATTRIBUTE, photo_url=auth.DELETE_ATTRIBUTE)