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

Java verwendet Apache.POI, um HSSFWorkbook nach Excel zu exportieren

Verwenden Sie HSSFWorkbook in Apache.POI, um nach...

So sortieren Sie eine Zeile oder Spalte in MySQL

Verfahren: Nach Beschreibung: Beides kann nicht e...

Ideen und Codes zur Implementierung der Vuex-Datenpersistenz

Was ist Vuex vuex: ist ein speziell für vue.js en...

HTML-Framework_Powernode Java Academy

1. Rahmen In einem Browser-Dokumentfenster kann n...

Detaillierte Schritte zur Installation und Konfiguration von MySQL 5.7

1. MySQL herunterladen 1. Melden Sie sich auf der...

Implementierung der MySQL-Benutzerrechteverwaltung

1. Einführung in MySQL-Berechtigungen Es gibt 4 T...

Node+Socket realisiert einfache Chatroom-Funktion

In diesem Artikel wird der spezifische Code von N...

Vor- und Nachteile des Tabellenlayouts und warum es nicht empfohlen wird

Nachteile von Tabellen 1. Tabellen nehmen mehr Byt...