[FIXED] Möglicher Ansatz zum Sichern von Rest-API-Endpunkten mithilfe von Facebook OAuth

Ausgabe

Ich habe viel über das Thema gelesen, aber alles, was ich finde, sind veraltete oder unvollständige Antworten, die mir nicht wirklich helfen und mich nur noch mehr verwirren. Ich schreibe eine Rest-API (Node+Express+MongoDB), auf die über eine Web-App (die auf derselben Domäne wie die API gehostet wird) und eine Android-App zugegriffen wird.

Ich möchte, dass nur meine Anwendungen und nur autorisierte Benutzer auf die API zugreifen können. Ich möchte auch, dass sich die Benutzer nur mit ihrem Facebook-Konto anmelden und anmelden können, und ich muss auf einige grundlegende Informationen wie Name, Profilbild und E-Mail zugreifen können.

Ein mögliches Szenario, das ich im Auge habe, ist:

  1. Der Benutzer meldet sich über Facebook bei der Web-App an, der App wird die Erlaubnis erteilt, auf die Facebook-Benutzerinformationen zuzugreifen, und sie erhält ein Zugriffstoken.
  2. Die Web-App fordert die API auf, zu bestätigen, dass dieser Benutzer tatsächlich in unserem System registriert ist, und sendet die E-Mail und das von Facebook erhaltene Token.
  3. Die API überprüft, ob der Benutzer existiert, speichert den Benutzernamen, das Token und einen Zeitstempel in der DB (oder Redis) und kehrt dann zur Client-App zurück.
  4. Jedes Mal, wenn die Client-App auf einen der API-Endpunkte trifft, muss sie neben anderen Informationen den Benutzernamen und das Token bereitstellen.
  5. Die API überprüft jedes Mal, ob das bereitgestellte Paar Benutzername/Token mit dem letzten Paar Benutzername/Token übereinstimmt, das in der DB gespeichert ist (unter Verwendung des Zeitstempels zum Bestellen), und dass nicht mehr als 1 Stunde vergangen ist, seit wir diese Informationen gespeichert haben (erneut unter Verwendung der Zeitstempel). Wenn dies der Fall ist, verarbeitet die API die Anfrage, andernfalls gibt sie eine 401 Unauthorized-Antwort aus.

Macht das Sinn? Hat dieser Ansatz eine makroskopische Sicherheitslücke, die mir fehlt? Ein Problem, das ich bei der Verwendung von MongoDB zum Speichern dieser Informationen sehe, besteht darin, dass die Sammlung schnell mit alten Token aufgebläht wird. In diesem Sinne denke ich, dass es am besten wäre, Redis mit einer Ablaufrichtlinie von 1 Stunde zu verwenden, damit alte Informationen automatisch von Redis entfernt werden.

Lösung

Ich denke, die bessere Lösung wäre diese:

  1. Einloggen über Facebook
  2. Übergeben Sie das Facebook AccessToken an den Server (über SSL für die Android-App, und lassen Sie es für die Web-App nach der FB-Anmeldung einfach zu einem API-Endpunkt umleiten)
  3. Überprüfen Sie das fb_access_tokenGegebene, stellen Sie sicher, dass es gültig ist. Holen Sie user_idsich emailund vergleichen Sie dies mit bestehenden Benutzern, um zu sehen, ob es sich um ein neues oder altes handelt.
  4. Erstellen Sie nun ein zufälliges, separates Element, api_access_tokendas Sie der Webapp und der Android-App zurückgeben. Wenn Sie Facebook für etwas anderes als die Anmeldung benötigen, speichern Sie das fb_access_tokenund verknüpfen Sie es in Ihrer DB mit der neuen api_access_tokenund Ihrer user_id.
  5. Senden Sie danach für jeden Anruf, um api_access_tokenihn zu authentifizieren. Wenn Sie die benötigen fb_access_token, um weitere Informationen zu erhalten, können Sie dies tun, indem Sie sie aus der DB abrufen.

Zusammenfassend : Vermeiden Sie, wann immer Sie können, das Passieren der fb_access_token. Wenn die api_access_tokenkompromittiert ist, haben Sie mehr Kontrolle darüber, wer der Angreifer ist, was er tut usw., als wenn er Zugriff auf die hätte fb_access_token. Sie haben auch mehr Kontrolle über Einstellungen wie Ablaufdatum, Verlängerung von fb_access_tokens usw

Stellen Sie nur sicher, dass Sie SSL verwenden, wenn Sie ein access_token jeglicher Art über HTTP übergeben.


Beantwortet von –
Tommy Crush


Antwort geprüft von –
Marie Seifert (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like