4

Je sais que ce problème a été beaucoup posé ici, mais je n'arrive toujours pas à trouver la réponse exacte qui peut résoudre mon problème. Je souhaite accéder à Firebase en utilisant des appels REST, en ajoutant un paramètre access_token.Firebase REST auth lors de la création du jeton avec node.js admin sdk

Le access_token est créé en utilisant le SDK Node.js administrateur, en utilisant le code suivant:

var admin = require("firebase-admin"); 

var serviceAccount = require("./pk.json"); 

admin.initializeApp({ 
    credential: admin.credential.cert(serviceAccount), 
    databaseURL: "https://XXX.firebaseio.com" 
}); 

var uid = "1234"; 


admin.auth().createCustomToken(uid) 
    .then(function(customToken) { 
    // Send token back to client 
    console.log("Token: "+customToken); 
    }) 
    .catch(function(error) { 
    console.log("Error creating custom token:", error); 
    }); 

Le problème est que si je prends le jeton créé à partir Node.js et utilise mon appel REST, je obtenez une erreur Unauthorized request. J'ai lu dans quelques questions que les personnes ont ajouté le paramètre de portée lors de l'émission du jeton, mais n'ont pas trouvé un moyen de le faire avec Node.js Admin SDK.

Les documents de Google ne sont pas aussi détaillés dans ce numéro. Une idée de ce que je pourrais essayer de résoudre celui-ci?

Répondre

5

Le jeton que vous utilisez pour vous authentifier auprès de l'API REST Firebase n'est pas le bon type de jeton. Vous utilisez un jeton personnalisé Authentification Firebase, qui ne peut être utilisé que pour authentifier l'un des kits SDK client Firebase via la méthode signInWithCustomToken() comme expliqué dans Sign in using custom tokens on clients. Pour s'authentifier auprès de l'API REST Firebase, vous disposez de deux options: les jetons Firebase ID (pour l'accès utilisateur) ou les jetons d'accès Google OAuth2 (pour l'accès administrateur).

authentifiez avec Firebase ID Tokens

Voir Retrieve ID tokens on the client pour une explication de la façon de récupérer des jetons d'accès dans les différents SDKs clients Firebase. Vous pouvez également échanger un jeton Firebase personnalisé pour une paire jeton jeton et actualisez ID via une API REST sans papier:

Endpoint:https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=<API_KEY>

Méthode:POST

Demande du corps:{ "token": <CUSTOM_TOKEN>, "returnSecureToken": true }

<API_KEY> est la clé API que vous obtenez de votre console Firebase que vous utilisez dans le Clients Firebase <CUSTOM_TOKEN> est un jeton personnalisé Firebase.

Depuis jetons d'identification expirent après une heure, vous devrez utiliser le jeton de rafraîchissement pour les rafraîchir par cette autre API REST sans papier:

Endpoint:https://securetoken.googleapis.com/v1/token?key=<API_KEY>

Méthode:POST

Demande corps:{ "refresh_token": <REFRESH_TOKEN>, "grant_type": "refresh_token" }

<API_KEY> est la même clé API que précédemment. <REFRESH_TOKEN> est le jeton d'actualisation de l'appel d'API précédent.

Une fois que vous avez un jeton d'identification, vous pouvez le passer à l'API REST via le paramètre de requête auth pour authentifier une requête. La demande respecte les règles de sécurité Firebase comme si l'utilisateur final connecté au client faisait la demande.

authentifiez avec Google accès Tokens

Pour authentifier avec un jeton d'accès Google OAuth2, la première chose que vous devez faire est d'obtenir un. Voir Retrieving an access token pour une explication de la façon de procéder. Il inclut uniquement un exemple Java, mais cela est possible dans plusieurs langues, y compris Node.js. Une fois que vous avez un jeton d'identification, vous pouvez le passer à l'API REST via le paramètre de requête access_token pour authentifier une requête. La requête sera faite avec un accès administrateur, remplaçant toutes les règles de sécurité Firebase et accordant un accès complet en lecture et en écriture.

+0

Donc, si je comprends bien, il n'y a aucun moyen d'obtenir des jetons d'identité sans SDK client (REST du serveur)? – Ran

+0

En fait, il existe une API REST non documentée que vous pouvez utiliser. Je travaille actuellement sur la documentation de cette API REST dans nos documents officiels, mais j'ai mis à jour ma réponse en attendant de vous débloquer. – jwngr

+0

Merci @jacobawenger, mais quand j'essaie de suivre vos instructions, je reçois "Impossible de valider la signature." après avoir utilisé le id_token comme valeur pour le paramètre auth .. qu'est-ce qui pourrait être faux? – Ran