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

Entmystifizierung des HTML 5-Arbeitsentwurfs

Das World Wide Web Consortium (W3C) hat einen Entw...

Beispiel einer Vorrendering-Methode für eine Vue-Einzelseitenanwendung

Inhaltsverzeichnis Vorwort vue-cli 2.0 Version vu...

So kapseln Sie Paging-Komponenten manuell in Vue3.0

In diesem Artikel wird der spezifische Code der m...

Was ist eine HTML-Datei? So öffnen Sie eine HTML-Datei

HTML steht für Hypertext Markup Language. Heutzut...

SpringBoot integriert Activiti7-Implementierungscode

Nach der offiziellen Veröffentlichung von Activit...

Implementierung des WeChat-Applet-Nachrichten-Pushs in Nodejs

Auswählen oder Erstellen einer Abonnementnachrich...

CSS+HTML zur Realisierung der Funktion der oberen Navigationsleiste

Implementierungseffektdiagramm für die Navigation...

Schritte zur Methode „Mysql-Abfragedatenbankkapazität“

Abfrage der Gesamtgröße aller Datenbanken So geht...

Was Sie über die Transaktionsisolierung von msyql wissen müssen

Was ist eine Transaktion? Eine Transaktion ist ei...