es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Autentícate en la base de datos en tiempo real usando un IdToken utilizando el Go Admin SDK.

Cuando uso el SDK de Firebase Admin en Go, me encuentro con un problema en el que no puedo autenticarme en la Base de Datos en Tiempo Real.

Así es como inicio la conexión con la base de datos:

option := option.WithTokenSource(tokenSource)
app, err := firebase.NewApp(context.Background(), &firebase.Config{
    DatabaseURL: "https://databaseName.europe-west1.firebasedatabase.app/",
    ProjectID:   "projectId",
}, option)
client, err := app.Database(context.Background())

El tokenSource es un TokenSource personalizado que devuelve un ReuseTokenSource. He reemplazado el método Token() para adaptarlo a mis necesidades, que es obtener un IdToken desde un punto final personalizado y luego, cuando el IdToken expire, actualizarlo desde el punto final securetoken.googleapis.com.

Pero con este método, cada vez que intento acceder a mi base de datos en tiempo real, obtengo el siguiente error:

http error status: 401; reason: Unauthorized request.

Incluso si las reglas para la base de datos están completamente abiertas (read/write=true).

El token que se está utilizando también es correcto, ya que puedo usarlo en una solicitud HTTP, la única diferencia es que tengo que usar ?auth=IDTOKEN en lugar de ?access_token=TOKEN (ver aquí).

TLDR: ¿Cómo puedo utilizar un IdToken dentro del SDK de Go Admin para autenticar el servicio en la Base de Datos en Tiempo Real? (Solo agregar que puedo autenticar el servicio en la Base de Datos Firestore con el mismo método y token).

¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede estar relacionado con la forma en que estás pasando el token al cliente de la base de datos. En lugar de usar el TokenSource personalizado, puedes intentar pasar el IdToken directamente como un queryParameter al crear el cliente de la Database. Así:

    option := option.WithTokenSource(tokenSource)
    app, err := firebase.NewApp(context.Background(), &firebase.Config{
        DatabaseURL: "https://databaseName.europe-west1.firebasedatabase.app/",
        ProjectID:   "projectId",
    }, option)
    client, err := app.Database(context.Background())
    token, err := tokenSource.Token()
    if err != nil {
       // manejar error
    }
    ctx := context.WithValue(context.Background(), firebasecontext.Credentials, fmt.Sprintf("auth=%s", token.AccessToken))
    ref := client.NewRef("path/to/data")
    data, err := ref.GetValue(ctx)
    // Manejar error y continuar con los datos
    

    Observa cómo usamos la clave firebasecontext.Credentials para pasar el token como un parámetro de consulta en lugar de usar el encabezado de autorización. Esto debería permitirte autenticarte en la base de datos en tiempo real usando el IdToken.

Comments are closed.