webentwicklung-frage-antwort-db.com.de

Wie verwende ich das Firebase-Aktualisierungs-Token für die Authentifizierung?

Ich benutze den JS-Bibliotheksaufruf firebase.auth().signInWithEmailAndPassword(email, password) und erhalte ein User-Objekt zurück. Das User-Objekt enthält eine refreshToken .

Ich benutze curl 'https://docs-examples.firebaseio.com/rest/saving-data/auth-example.json?auth=TOKEN', um Firebase anzurufen. 

Das Token verfällt schließlich. Damit es so aussieht, als ob die Anwendung (iOS und macOS) einen permanenten Login hat, möchte ich das Token aktualisieren. Wie mache ich das mit der Bibliothek REST oder JS? Ich kann in der Dokumentation keine Aufrufe finden, die es mir ermöglichen, die refreshToken zu verwenden, um eine neue token zu erhalten.

25
kgaidis

Derzeit habe ich dies nur gefunden: https://developers.google.com/identity/toolkit/reference/securetoken/rest/v1/token

Sie müssen eine HTTP-Anfrage stellen:

POSThttps://securetoken.googleapis.com/v1/token?key=YOUR_KEY

Wo YOUR_KEY in der Google Entwickler-Konsole> API Manager> Credentials gefunden werden kann. Es befindet sich im Abschnitt API Keys.

Stellen Sie sicher, dass der Anforderungstext in folgendem Format strukturiert ist:

grant_type=refresh_token&refresh_token=REFRESH_TOKEN

Dabei ist REFRESH_TOKEN das Aktualisierungstoken des Firebase-Benutzerobjekts bei der Anmeldung.

Sie müssen den Header Content-Type: application/x-www-form-urlencoded setzen, andernfalls erhalten Sie Fehler (z. B. "MISSING_GRANT_TYPE").

Der Aufruf POST gibt einen neuen access_token zurück.


** UPDATE ** Dies ist jetzt auch in den Firebase-Dokumenten REST im Abschnitt Exchange a refresh token for an ID token dokumentiert:

https://firebase.google.com/docs/reference/rest/auth/

14
kgaidis

Wenn Sie von einem Browser aus anrufen, aktualisiert .getIdToken(true) Ihr Token automatisch. Rufen Sie so an:

firebase.auth().currentUser.getIdToken(/ forceRefresh / true)
.then(function(idToken) {

}).catch(function(error) {

});

Weitere Informationen hier https://firebase.google.com/docs/reference/js/firebase.User#getIdToken

18
Yevgen

Ich vermute, die meisten Leute hier suchen nach einer Möglichkeit, ihre Authentifizierung nicht in einem Browser, sondern z. auf einem Knoten-Backend. Es stellt sich heraus, dass es tatsächlich einen Weg gibt, dies zu tun:

  1. Tauschen Sie das Refresh-Token gegen ein Access-Token (mithilfe der öffentlichen API von Google).
  2. Tauschen Sie den Zugriffstoken gegen einen benutzerdefinierten Token (unter Verwendung einer Firebase-Funktion, siehe unten).
  3. Mit benutzerdefiniertem Token anmelden

Hier ist das Wesentliche des Codes:

const requestP = require('request-promise');
const fsP = require('fs').promises;

const refreshToken = await fsP.readFile('./refresh_token.txt');
const res = await requestP.post({
  headers: {'content-type': 'application/x-www-form-urlencoded'},
  url: 'https://securetoken.googleapis.com/v1/token?key=' + firebaseConf.apiKey,
  body: 'grant_type=refresh_token&refresh_token=' + refreshToken,
  json: true
});
const customToken = await requestP.post({
  headers: {'content-type': 'text/plain'},
  url: 'https://<yourFirebaseApp>.cloudfunctions.net/createCustomToken',
  body: {token: res.access_token},
  json: true
});
await firebaseApp.auth().signInWithCustomToken(customToken);

Und die Firebase-Funktion:

export const createCustomToken = functions.https.onRequest(async (request, response) => {
    response.set('Access-Control-Allow-Origin', '*');

    try {
        const token = JSON.parse(request.body).token;
        const decodedToken = await admin.auth().verifyIdToken(token);
        const customToken = await admin.auth().createCustomToken(decodedToken.uid);
        response.send(customToken);
    } catch(e) {
        console.log(e);
        response.sendStatus(500);
    }
});
1
Martin Cremer
// Create a callback which logs the current auth state
function authDataCallback(authData) {
  if (authData) {
    console.log("User " + authData['uid'] + " is logged with token" + authData['ie']);
  } else {
    console.log("User is logged out");
  }
}
// Register the callback to be fired every time auth state changes
var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.onAuth(authDataCallback);

Das Ereignis onAuth wird bei der Seitenaktualisierung aufgerufen, wenn der Benutzer abgemeldet wurde. authData ist null, andernfalls nicht. Sie finden das Token in authdata['ie']. Im Screenshot unten habe ich das Token nach dem Auth- und Authdata-Objekt gedruckt. Wie Sie sehen, sind AuthData ['ie'] und Token ähnlich.

 authdata.ie and token

0
Nikita