firebase - current - Uso de tokens personalizados para realizar solicitudes de REST a FB DB como administrador
firebase web (2)
Estoy migrando a la nueva base de datos y 3.0 libs del cliente. Estoy actualizando la parte que genera un token de autenticación personalizado (en nuestro servidor) para hacer un PATCH
para actualizar un recurso en el DB de Firebase.
Estas solicitudes de PATCH solían ser realizadas por nuestro servidor a Firebase usando reclamos de admin
basados en esto: https://www.firebase.com/docs/rest/guide/user-auth.htm
Para el nuevo DB, estoy generando el token JWT (usando ruby-jwt
) de esta manera:
payload = {
aud: "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
claims: custom_claims.merge({ admin: true }),
exp: now_seconds + (60 * 60), # Maximum expiration time is one hour
iat: now_seconds,
iss: service_account_email,
sub: service_account_email,
uid: uid
}
JWT.encode(payload, private_key, "RS256")
Una solicitud de PATCH
con este token para Firebase DB falla con: Missing claim ''kid'' in auth header
.
En la nueva base de Firebase necesita usar directamente una cuenta de servicio para crear credenciales de acceso administrativo. Aquí hay un fragmento de Node.js que muestra cómo realizar una llamada REST a la base de datos:
// key.json is a service account key downloaded from the Firebase Console
var key = require(''./key.json'');
var google = require(''googleapis'');
var request = require(''request'');
var DATABASE_URL = ''https://<databaseName>.firebaseio.com'';
var jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, [
''https://www.googleapis.com/auth/userinfo.email'',
''https://www.googleapis.com/auth/firebase.database''
]);
jwtClient.authorize(function(err, tokens) {
request({
url: DATABASE_URL + ''/.json'',
method: ''GET'',
headers: {
''Authorization'': ''Bearer '' + tokens.access_token
}
}, function(err, resp) {
console.log(resp.body);
});
});
Para hacer lo mismo en Ruby, puedes echar un vistazo a la gema googleauth para obtener el token de acceso usando las credenciales de la cuenta de servicio.
Aquí está el equivalente de la respuesta de Michael Bleigh usando el módulo ruby googleauth:
require ''googleauth''
scopes = [ ''https://www.googleapis.com/auth/userinfo.email'', ''https://www.googleapis.com/auth/firebase.database'']
auth = ::Google::Auth.get_application_default(scopes)
auth_client = auth.dup
auth_client.sub = "[email protected]"
token = auth_client.fetch_access_token!
También deberá establecer la variable de entorno GOOGLE_APPLICATION_CREDENTIALS
en la ruta del archivo JSON de su cuenta de servicio. el valor de auth_client.sub
proviene de client_email
en este archivo JSON.
Por supuesto, como se indica arriba, esto solo es válido en una aplicación de servidor que usted controle.
Además, realizar la solicitud a la API REST de firebase sigue siendo un ejercicio para el lector.
referencias