2016-05-25 6 views
7

Sto migrando al nuovo database e alle librerie client 3.0. Sto aggiornando la parte che genera un token di autenticazione personalizzato (sul nostro server) per fare un PATCH per aggiornare una risorsa nel DB Firebase.Utilizzo di token personalizzati per fare richieste REST al DB FB come amministratore

Queste richieste cerotto utilizzato deve essere fatta dal nostro server di Firebase utilizzando admin pretese sulla base di questo: https://www.firebase.com/docs/rest/guide/user-auth.htm

Per il nuovo DB, sto generando il token JWT (usando ruby-jwt) come questo:

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 richiesta PATCH con questo token al DB Firebase non riesce con: Missing claim 'kid' in auth header.

+0

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

risposta

1

Qui è l'equivalente di risposta di Michael Bleigh utilizzando il modulo googleauth rubino:

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! 

È inoltre necessario impostare la variabile ambiente GOOGLE_APPLICATION_CREDENTIALS al percorso del file dell'account JSON servizio. il valore di auth_client.sub deriva da client_email in questo file JSON.

Ovviamente, come sopra, questo è valido solo in un'applicazione server che controlli.

Inoltre, effettuare la richiesta all'API REST di Firebase è ancora un esercizio per il lettore.

riferimenti

14

Nel nuovo Firebase è necessario utilizzare direttamente un account di servizio per creare credenziali di accesso amministrativo. Ecco un frammento Node.js che mostra come effettuare una chiamata REST al database:

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

a fare lo stesso in Ruby, si potrebbe dare un'occhiata al googleauth gem per il recupero del token di accesso utilizzando le credenziali dell'account di servizio .

+0

E' è possibile includere attestazioni personalizzate, accessibili dalle regole del mio database, come con i token REST personalizzati Firebase 2.x? – user1881056

+0

È possibile aggiungere attestazioni personalizzate con il parametro di query 'auth_variable_override' (basta renderlo un oggetto JSON valido). –

+0

Intendi come parametro di query nella richiesta REST stessa? Come è sicuro? Il mio cliente non è affidabile (un dispositivo IoT) e ho bisogno di un modo sicuro per limitare il suo accesso al DB Firebase. In effetti, questa caratteristica (apparentemente non documentata) esplode nel mio intero modello di sicurezza. Spero di averti frainteso! – user1881056

Problemi correlati