So erreichen Sie eine nahtlose Token-Aktualisierung

So erreichen Sie eine nahtlose Token-Aktualisierung

Vorwort:

Als ich kürzlich an einer Anfrage arbeitete, ging es um ein Login token und das Produkt warf eine Frage auf: Kann token länger sein? Ich muss mich häufig anmelden.

Frontend: Backend, können Sie die Ablaufzeit des Tokens länger einstellen?

Backend: Ja, aber dies ist nicht sicher. Sie können eine bessere Methode verwenden.

Frontend: Welche Methode?

Backend: Bietet eine Schnittstelle zum Aktualisieren von Token und aktualisiert Token regelmäßig

Front-End: OK, lass mich darüber nachdenken.

1. Nachfrage

Wenn token abläuft, aktualisieren Sie token . Das Front-End muss token sinnlos aktualisieren, d. h. der Benutzer sollte es beim Aktualisieren token nicht bemerken, um häufige Anmeldungen zu vermeiden. Umsetzungsideen

Methode 1

Das Backend gibt die Ablaufzeit zurück, das Frontend bestimmt token und ruft die Schnittstelle zum Aktualisieren to auf.

Nachteile: Das Backend muss ein zusätzliches Feld für token bereitstellen. Zur Beurteilung wird die lokale Zeit verwendet. Wenn die lokale Zeit manipuliert wird, schlägt das Abfangen fehl, insbesondere wenn die lokale Zeit langsamer als die Serverzeit ist.

Methode 2

Schreiben Sie einen Timer, um die token -Schnittstelle regelmäßig zu aktualisieren

Nachteile: Ressourcenverschwendung, Leistungsverbrauch, nicht zu empfehlen.

Methode 3

Abfangen im Antwort-Interceptor, feststellen, dass token abgelaufen ist, und die Schnittstelle zum Aktualisieren des Tokens aufrufen

2. Umsetzung

Das grundlegende Framework von axios , service.interceptors.response zum Abfangen verwendet

Axios von „Axios“ importieren

Dienst.Interceptors.Antwort.Verwendung(
  Antwort => {
    wenn (Antwort.Daten.Code === 409) {
        returniere RefreshToken({ RefreshToken: localStorage.getItem('refreshToken'), token: getToken() }).dann(res => {
          const { token } = res.data
          setzeToken(Token)
          Antwort.header.Authorization = `${token}`
        }).catch(err => {
          entfernenToken()
          router.push('/login')
          returniere Promise.reject(err)
        })
    }
    Antwort zurückgeben && Antwort.Daten
  },
  (Fehler) => {
    Nachricht.Fehler(Fehler.Antwort.Daten.Nachricht)
    returniere Promise.reject(Fehler)
  })

3. Problemlösung

Frage 1: Wie verhindere ich mehrfache Token-Aktualisierungen?

Wir verwenden eine Variable isRefreshing , um zu steuern, ob token Status aktualisiert wird.

Axios von „Axios“ importieren

Dienst.Interceptors.Antwort.Verwendung(
  Antwort => {
    wenn (Antwort.Daten.Code === 409) {
      wenn (!isRefreshing) {
        isRefreshing = wahr
        returniere RefreshToken({ RefreshToken: localStorage.getItem('refreshToken'), token: getToken() }).dann(res => {
          const { token } = res.data
          setzeToken(Token)
          Antwort.header.Authorization = `${token}`
        }).catch(err => {
          entfernenToken()
          router.push('/login')
          returniere Promise.reject(err)
        }).schließlich(() => {
          isRefreshing = false
        })
      }
    }
    Antwort zurückgeben && Antwort.Daten
  },
  (Fehler) => {
    Nachricht.Fehler(Fehler.Antwort.Daten.Nachricht)
    returniere Promise.reject(Fehler)
  })

Frage 2: Wie lösen andere Schnittstellen dieses Problem, wenn zwei oder mehr Anfragen gleichzeitig initiiert werden?

Wenn die zweite abgelaufene Anfrage eingeht, wird token aktualisiert. Wir speichern diese Anfrage zunächst in einer Array-Warteschlange und versuchen, diese Anfrage warten zu lassen, bis token aktualisiert ist. Anschließend versuchen wir nacheinander erneut, die Anfragewarteschlange zu leeren. Wie können wir diese Anfrage also warten lassen? Um dieses Problem zu lösen, müssen wir Promise verwenden. Nach dem Speichern der Anfrage in der Warteschlange wird gleichzeitig ein Promise zurückgegeben, sodass sich das Promise immer im Status Pending befindet (d. h. „resolve“ wird nicht aufgerufen). Zu diesem Zeitpunkt wartet die Anfrage weiter. Solange wir resolve nicht ausführen, wartet die Anfrage weiter. Wenn die Schnittstelle der Aktualisierungsanforderung zurückgegeben wird, rufen wir „Resolve“ erneut auf und versuchen es nacheinander erneut.

Endgültiger Code:

Axios von „Axios“ importieren

//Ob es aktualisiert wird, let isRefreshing = false
//Wiederholen Sie die Warteschlange let requests = []
Dienst.Interceptors.Antwort.Verwendung(
  Antwort => {
  //Vereinbarter Code 409, Token abgelaufen, wenn (response.data.code === 409) {
      wenn (!isRefreshing) {
        isRefreshing = true
        //Refresh-Token-Schnittstelle aufrufen return refreshToken({ refreshToken: localStorage.getItem('refreshToken'), token: getToken() }).then(res => {
          const { token } = res.data
          // Token ersetzen
          setzeToken(Token)
          Antwort.header.Authorization = `${token}`
           // Nachdem das Token aktualisiert wurde, führen Sie die Array-Methode requests.forEach((cb) => cb(token)) erneut aus.
          requests = [] // Erneut anfordern und löschen return service(response.config)
        }).catch(err => {
        //Zur Login-Seite springen removeToken()
          router.push('/login')
          returniere Promise.reject(err)
        }).schließlich(() => {
          isRefreshing = false
        })
      } anders {
        // Gibt ein Promise zurück, das nicht eingelöst wurde
        gib ein neues Versprechen zurück (Auflösen => {
          // Auflösung im Funktionsformular speichern und auf Aktualisierung warten, bevor requests.push(token => { ausgeführt wird
            Antwort.header.Authorization = `${token}`
            lösen(Dienst(Antwort.config))
          })
        })
      }
    }
    Antwort zurückgeben && Antwort.Daten
  },
  (Fehler) => {
    Nachricht.Fehler(Fehler.Antwort.Daten.Nachricht)
    returniere Promise.reject(Fehler)
  }
)

Dies ist das Ende dieses Artikels zur Implementierung einer nahtlosen Token-Aktualisierung. Weitere Informationen zur Implementierung einer nahtlosen Token-Aktualisierung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • SpringBoot JWT implementiert eine Token-Login-Aktualisierungsfunktion
  • Über Vue, um wiederholte Eingabeaufforderungen beim Aktualisieren der Seite nach Ablauf des Tokens zu vermeiden
  • Detaillierte Erklärung der schmerzlosen Token-Aktualisierungsmethode von Uniapp
  • Detaillierte Erklärung des JWT-Aktualisierungstokens in der ASP.NET Core Web API
  • Automatische Aktualisierung des Token-Vorgangs, wenn das Token während der Anforderung abläuft
  • Implementierung der automatischen Aktualisierung von SpringSecurity Jwt Token
  • Analyse des Aktualisierungstokenprozesses basierend auf Springboot+JWT
  • Beispielcode des Axios-Interceptor-Token-Aktualisierungsmechanismus unter Vue
  • Laravel (Lumen) löst das Problem des JWT-Auth-Aktualisierungstokens

<<:  Erstellen Sie ein Docker-Image mit Dockerfile

>>:  CSS-Layout-Tutorial: So erreichen Sie eine vertikale Zentrierung

Artikel empfehlen

Eine kurze Diskussion über die Verwendung der Web Storage API

Inhaltsverzeichnis 1. Lokale Speichertechnologie ...

HTML-Versionsdeklaration DOCTYPE-Tag

Wenn wir den Quellcode einer normalen Website öff...

So installieren Sie Android x86 in einer virtuellen VMware-Maschine

Manchmal möchten Sie eine App testen, aber nicht ...

Verschieben Sie die MySQL-Datenbank unter Windows auf eine andere Festplatte

Vorwort Heute habe ich MySQL installiert und fest...

So erstellen Sie mit Squid einen Proxyserver für http und https

Als wir nginx eingeführt haben, haben wir nginx a...

Wo werden MySQL-Daten gespeichert?

Speicherort der MySQL-Datenbank: 1. Wenn MySQL di...

Schritte zum Einrichten einer HTTPS-Website basierend auf Nginx

Inhaltsverzeichnis Vorwort: Verschlüsselungsalgor...

So löschen Sie zusätzliche Kernel in Ubuntu

Schritt 1: Den aktuellen Kernel anzeigen rew $ un...

Bootstrap 3.0 Studiennotizen Rastersystemprinzip

Durch die kurze Einführung in den beiden vorherig...

Prozess des Klassenlademechanismus von Tomcat und Quellcodeanalyse

Inhaltsverzeichnis Vorwort 1. Strukturdiagramm de...

Verwendung des Linux-Crontab-Befehls

1. Befehlseinführung Der Befehl contab (Cron-Tabe...

So deinstallieren Sie das native OpenJDK von Linux und installieren Sun JDK

Siehe: https://www.jb51.net/article/112612.htm Üb...