2016-05-25 9 views
7

Przeprowadzam migrację do nowej bazy danych i wersji 3.0 klienta. Aktualizuję część, która generuje niestandardowy token autoryzacji (na naszym serwerze), aby wykonać PATCH, aby zaktualizować zasób w bazie danych Firebase DB.Używanie niestandardowych tokenów do wysyłania żądań REST do FB DB jako administrator

tych wniosków PATCH używanych być wykonane przez nasz serwer do Firebase użyciu admin roszczeń na podstawie tego: https://www.firebase.com/docs/rest/guide/user-auth.htm

dla nowego DB, mam generowania tokenu JWT (używając ruby-jwt) tak:

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

Żądanie z tym tokenem do bazy danych Firebase DB kończy się niepowodzeniem z: Missing claim 'kid' in auth header.

+0

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

Odpowiedz

1

Oto odpowiednik odpowiedź Michaela Bleigh za pomocą ruby ​​moduł 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! 

Potrzebny będzie również ustawić zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS do ścieżki pliku konto JSON usług. wartość dla auth_client.sub pochodzi z client_email w tym pliku JSON.

Oczywiście, jak wyżej, jest to ważne tylko w aplikacji serwera, którą kontrolujesz.

Ponadto, wysłanie żądania do interfejsu REST API firefase wciąż jest ćwiczeniem dla czytelnika.

referencje

14

W nowej bazie Firebase należy bezpośrednio użyć konta usługi, aby utworzyć poświadczenia dostępu administratora. Oto fragment node.js, który pokazuje, jak wykonać połączenie REST do bazy danych:

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

zrobić to samo w Ruby, można spojrzeć na googleauth gem do pobierania token dostępu przy użyciu poświadczeń konta usługi .

+0

można włączyć niestandardowe roszczenia, dostępne z moich reguł bazy danych, jak z niestandardowymi tokenami REST Firebase 2.x? – user1881056

+0

Możesz dodawać własne oświadczenia za pomocą parametru zapytania "auth_variable_override" (po prostu ustaw go jako prawidłowy obiekt JSON). –

+0

Masz na myśli jako parametr zapytania w samym żądaniu REST? Jak to jest bezpieczne? Mój klient jest niezaufany (urządzenie IoT) i potrzebuję bezpiecznego sposobu na ograniczenie jego dostępu do bazy danych Firebase DB. W rzeczywistości ta (z pozoru nieudokumentowana) funkcja dmucha całość w całym moim modelu bezpieczeństwa. Mam nadzieję, że źle cię zrozumiałem! – user1881056

Powiązane problemy