2016-05-25 8 views
7

Ich migriere auf die neue Datenbank und die 3.0-Client-Bibliotheken. Ich aktualisiere den Teil, der ein benutzerdefiniertes Authentifizierungs-Token generiert (auf unserem Server), um eine PATCH zu tun, um eine Ressource in der Firebase-DB zu aktualisieren.Verwenden von benutzerdefinierten Token zum Ausführen von REST-Anforderungen an die FB DB als Administrator

verwendet, um diese PATCH Anfragen von unserem Server hergestellt werden, um Feuerbasis mit admin Ansprüche auf dieser Basis: https://www.firebase.com/docs/rest/guide/user-auth.htm

Für die neue DB, ich bin Erzeugung des JWT-Token (mit ruby-jwt) wie folgt aus:

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") 

Eine PATCH Anfrage mit diesem Token an die Firebase-DB schlägt fehl mit: Missing claim 'kid' in auth header.

+0

Kreuz-post: https://groups.google.com/forum/#!topic/firebase-talk/XTJfiltow-I –

Antwort

1

ist das Äquivalent von Michael Bleigh Antwort mit dem Rubin googleauth Modul:

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! 

Sie werden auch die GOOGLE_APPLICATION_CREDENTIALS Umgebungsvariable auf den Pfad Ihres Dienstkonto JSON-Datei festlegen müssen. Der Wert für auth_client.sub kommt von client_email in dieser JSON-Datei.

Natürlich ist dies wie oben nur in einer Serveranwendung gültig, die Sie steuern.

Auch die Anfrage an die REST-API der Firebase ist immer noch eine Übung für den Leser.

Referenzen

14

Im neuen Firebase müssen Sie direkt ein Dienstkonto verwenden, um Anmeldeinformationen für den administrativen Zugriff zu erstellen. Hier ist ein Node.js-Snippet, das zeigt, wie eine REST-Anruf tätigen, um die Datenbank:

// 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); 
    }); 
}); 

Um das gleiche in Ruby zu tun, könnte nehmen Sie einen Blick auf die googleauth gem zum Abrufen des Zugriffstoken Dienstkontodaten mit . Hier

+0

Ist Es ist möglich, benutzerdefinierte Ansprüche einzufügen, auf die von meinen Datenbankregeln aus zugegriffen werden kann, z. B. mit Firebase 2.x benutzerdefinierten REST-Tokens. – user1881056

+0

Sie können benutzerdefinierte Ansprüche mit dem Abfrageparameter 'auth_variable_override' hinzufügen (machen Sie es einfach zu einem gültigen JSON-Objekt). –

+0

Sie meinen als Abfrageparameter in der REST-Anfrage selbst? Wie ist das sicher? Mein Client ist nicht vertrauenswürdig (ein IoT-Gerät) und ich brauche eine sichere Möglichkeit, um den Zugriff auf die Firebase-Datenbank zu beschränken. In der Tat, dieses (scheinbar undokumentierte) Feature durchbricht ein ganzes in meinem gesamten Sicherheitsmodell. Ich hoffe ich habe dich missverstanden! – user1881056

Verwandte Themen