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.
Derzeit habe ich dies nur gefunden: https://developers.google.com/identity/toolkit/reference/securetoken/rest/v1/token
Sie müssen eine HTTP-Anfrage stellen:
POST
https://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:
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
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:
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);
}
});
// 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.