wake-up-neo.com

So schützen Sie den HTTP-Endpunkt der firebase Cloud Function, um nur von Firebase authentifizierte Benutzer zuzulassen

Mit der neuen Firebase-Cloud-Funktion habe ich beschlossen, einige meiner HTTP-Endpunkte auf Firebase zu verschieben. Alles funktioniert super ... Aber ich habe das folgende Problem. Ich habe zwei Endpunkte, die von HTTP-Triggern erstellt wurden (Cloud-Funktionen)

  1. Ein API-Endpunkt zum Erstellen von Benutzern und zum Zurückgeben des von Firebase Admin SDK generierten benutzerdefinierten Tokens.
  2. Ein API-Endpunkt zum Abrufen bestimmter Benutzerdetails.

Der erste Endpunkt ist zwar in Ordnung, aber für meinen zweiten Endpunkt möchte ich ihn nur für authentifizierte Benutzer schützen. das heißt, jemand, der das Token hat, das ich zuvor generiert habe.

Wie löse ich das?

Ich weiß, wir können die Header-Parameter in der Cloud-Funktion mit bekommen

request.get('x-myheader')

aber gibt es eine Möglichkeit, den Endpunkt genauso zu schützen wie die Echtzeitdatenbank?

88
spaceMonkey

Es gibt ein offizielles Codebeispiel für das, was Sie versuchen zu tun. Es wird gezeigt, wie Sie Ihre HTTPS-Funktion so einrichten, dass ein Authorization-Header mit dem Token erforderlich ist, das der Client während der Authentifizierung erhalten hat. Die Funktion verwendet die firebase-admin-Bibliothek, um das Token zu überprüfen.

Sie können auch " aufrufbare Funktionen " verwenden, um das Boilerplate zu vereinfachen, wenn Ihre App Firebase-Clientbibliotheken verwenden kann.

88
Doug Stevenson

Wie von @Doug erwähnt, können Sie firebase-admin, um ein Token zu überprüfen. Ich habe ein kurzes Beispiel aufgestellt:

exports.auth = functions.https.onRequest((req, res) => {
  cors(req, res, () => {
    const tokenId = req.get('Authorization').split('Bearer ')[1];

    return admin.auth().verifyIdToken(tokenId)
      .then((decoded) => res.status(200).send(decoded))
      .catch((err) => res.status(401).send(err));
  });
});

Im obigen Beispiel habe ich auch CORS aktiviert, aber das ist optional. Zuerst erhalten Sie den Header Authorization und ermitteln den Header token.

Dann können Sie firebase-admin, um dieses Token zu überprüfen. Sie erhalten die dekodierten Informationen für diesen Benutzer in der Antwort. Andernfalls wird ein Fehler ausgegeben, wenn das Token nicht gültig ist.

Ich hoffe, es hilft.

76
Will

Wie auch von @Doug erwähnt, können Sie Callable Functions verwenden, um einen Boilerplate-Code auszuschließen von Ihrem Client und Ihrem Server zu entfernen.

Beispielhafte aufrufbare Funktion:

export const getData = functions.https.onCall((data, context) => {
  // verify Firebase Auth ID token
  if (!context.auth) {
    return { message: 'Authentication Required!', code: 401 };
  }

  // do your things..
  const uid = context.auth.uid;
  const query = data.query;

  return { message: 'Some Data', code: 400 };
});

Es kann wie folgt direkt von Ihrem Client aufgerufen werden:

firebase.functions().httpsCallable('getData')({query}).then(result => console.log(result));
0
Benny