Heim Web-Frontend js-Tutorial So aktualisieren Sie das Token in Vue

So aktualisieren Sie das Token in Vue

Jul 21, 2018 am 11:57 AM
vue

In diesem Artikel erfahren Sie, wie Sie Token in Vue aktualisieren. Der Inhalt ist sehr gut. Ich hoffe, er kann allen helfen.

Token-Authentifizierungsmechanismus

Nachdem die Client-Anmeldeanforderung erfolgreich war, verschlüsselt der Server die Benutzerinformationen (z. B. Benutzer-ID) mithilfe eines speziellen Algorithmus und sendet sie an Wenn der Benutzer das nächste Mal eine Anfrage initiiert, wird dieses Token übermittelt und der Server entschlüsselt das Token zur Überprüfung. Wenn es erfolgreich ist, werden die angeforderten Daten an den Server zurückgegeben Client; andernfalls schlägt die Anfrage fehl.

Vorteile des Tokens

Es ist zustandslos und der Server muss keine Sitzungsinformationen wie bei der herkömmlichen Identitätsauthentifizierung (Sitzung) speichern, was den Druck auf den Server verringert .

Vues Token-Aktualisierungsverarbeitung

Nach einer kurzen Einführung in den Token-Authentifizierungsmechanismus geben Sie den Text ein...

Allgemein Für die Aus Sicherheitsgründen wird für das Token eine Ablaufzeit festgelegt. Nach Ablauf kann die entsprechende Schnittstelle nicht mehr angefordert werden. Was soll ich zu diesem Zeitpunkt tun?

Im aktuellen Projekt des Unternehmens haben wir uns für eine bessere Benutzererfahrung entschieden, den Token manuell zu aktualisieren. Nachdem die Anmeldeanforderung erfolgreich war, werden ein Token und die Token-Ablaufzeit zurückgegeben. Bei jeder Anforderung der API kann das Frontend zunächst feststellen, ob das Token bald abläuft oder abgelaufen ist. Wenn ja, fordern Sie die Aktualisierungstoken-Schnittstelle an und den ursprünglichen Token erfolgreich ersetzen. Erst dann kann die Anforderung erneut gestartet werden.

Als nächstes schauen wir uns direkt den Code an. Dies ist die relevante Operation, die im Anforderungsinterceptor von vue ausgeführt wird:

/*是否有请求正在刷新token*/
window.isRefreshing = false
/*被挂起的请求数组*/
let refreshSubscribers = []

/*获取刷新token请求的token*/
function getRefreshToken () {
 return JSON.parse(localStorage.auth).refresh_token
}

/*push所有请求到数组中*/
function subscribeTokenRefresh (cb) {
 refreshSubscribers.push(cb)
}

/*刷新请求(refreshSubscribers数组中的请求得到新的token之后会自执行,用新的token去请求数据)*/
function onRrefreshed (token) {
 refreshSubscribers.map(cb => cb(token))
}

/*请求拦截器*/
ajax.interceptors.request.use(
 config => {
  const authTmp = localStorage.auth
  /*判断是否已登录*/
  if (authTmp) {
   /*解析登录信息*/
   let auth = JSON.parse(authTmp)
   /*判断auth是否存在*/
   if (auth) {
    /*在请求头中添加token类型、token*/
    config.headers.Authorization = auth.token_type + ' ' + auth.token
    /*判断刷新token请求的refresh_token是否过期*/
    if (util.isRefreshTokenExpired()) {
     alert('刷新token过期,请重新登录')
     /*清除本地保存的auth*/
     localStorage.removeItem('auth')
     window.location.href = '#/login'
     return
    }
    /*判断token是否将要过期*/
    if (util.isTokenExpired() && config.url.indexOf('admin/auth/current') === -1) {
     /*判断是否正在刷新*/
     if (!window.isRefreshing) {
      /*将刷新token的标志置为true*/
      window.isRefreshing = true
      /*发起刷新token的请求*/
      apiList.refreshToken({refresh_token: getRefreshToken()}).then(res => {
       /*将标志置为false*/
       window.isRefreshing = false
       /*成功刷新token*/
       config.headers.Authorization = res.data.data.token_type + ' ' + res.data.data.token
       /*更新auth*/
       localStorage.setItem('auth', JSON.stringify(res.data.data))
       /*执行数组里的函数,重新发起被挂起的请求*/
       onRrefreshed(res.data.data.token)
       /*执行onRefreshed函数后清空数组中保存的请求*/
       refreshSubscribers = []
      }).catch(err => {
       alert(err.response.data.message)
       /*清除本地保存的auth*/
       // localStorage.removeItem('auth')
       window.location.href = '#/login'
      })
     }
     /*把请求(token)=>{....}都push到一个数组中*/
     let retry = new Promise((resolve, reject) => {
      /*(token) => {...}这个函数就是回调函数*/
      subscribeTokenRefresh((token) => {
       config.headers.Authorization = 'Bearer ' + token
       /*将请求挂起*/
       resolve(config)
      })
     })
     return retry
    }
   }
   return config

  } else {
   /*未登录直接返回配置信息*/
   return config
  }
 },
 /*错误操作*/
 err => {
  return Promise.reject(err)
 }
)
Nach dem Login kopieren

Hier sind einige Punkte zu beachten:

1. Wenn das Token bald abläuft oder abgelaufen ist, benötigen wir im Prinzip nur eine Schnittstelle, um eine Anforderung zum Aktualisieren des Tokens auszulösen Sperren: Wenn der Vorgang zum Aktualisieren des Tokens ausgelöst wird, werden andere Triggervorgänge ausgeschlossen.

window.isRefreshing = false
Nach dem Login kopieren

2. Die Aktualisierungstokenschnittstelle verwendet auch aus Sicherheitsgründen ein anderes Token, das jedoch im Allgemeinen länger ist als das Ablaufdatum gewöhnlicher Token Es dauert lange, daher werden Sie im obigen Code feststellen, dass ich beim Abfangen der Anforderung Priorität habe, ob das Refresh_token abgelaufen ist. Wenn es abläuft, werde ich mich direkt abmelden, ohne mit dem nächsten Schritt fortzufahren.

 /*判断刷新token请求的refresh_token是否过期*/
if (util.isRefreshTokenExpired() && config.url.indexOf('admin/auth/current') === -1) {
 alert('刷新token过期,请重新登录')
 /*清除本地保存的auth*/
 localStorage.removeItem('auth')
 window.location.href = '#/login'
 return
}
Nach dem Login kopieren

3. Nachdem wir den Vorgang zum Aktualisieren des Tokens ausgelöst haben, müssen wir zuerst andere Anforderungen aussetzen und diese Anforderungen dann erneut initiieren, nachdem wir das neue Token erhalten haben.

/*把请求(token)=>{....}都push到一个数组中*/
let retry = new Promise((resolve, reject) => {
 /*(token) => {...}这个函数就是回调函数*/
 subscribeTokenRefresh((token) => {
  config.headers.Authorization = 'Bearer ' + token
  /*将请求挂起*/
  resolve(config)
 })
})
return retry
Nach dem Login kopieren

Führen Sie den folgenden Code im Erfolgsrückruf der Aktualisierungstokenanforderung aus und initiieren Sie die Anforderung erneut.

 /*执行数组里的函数,重新发起被挂起的请求*/
 onRrefreshed(res.data.data.token)
Nach dem Login kopieren

Da jemand in den Kommentaren nach der Util-Datei gefragt hat, möchte er wahrscheinlich wissen, wie er den Token-Ablauf ermitteln kann. Tatsächlich wird eine Token-Ablaufzeit zurückgegeben Rufen Sie es zuerst auf und nehmen Sie es dann bei Bedarf heraus und vergleichen Sie es mit der Ortszeit

/*判断token是否过期*/
function isTokenExpired() {
 /*从localStorage中取出token过期时间*/
 let expiredTime = new Date(JSON.parse(localStorage.auth).expired_at).getTime() / 1000
 /*获取本地时间*/
 let nowTime = new Date().getTime() / 1000
 /*获取校验时间差*/
 let diffTime = JSON.parse(sessionStorage.diffTime)
 /*校验本地时间*/
 nowTime -= diffTime
 /*如果 < 10分钟,则说明即将过期*/
 return (expiredTime - nowTime) < 10*60
}
Nach dem Login kopieren

Verwandte Empfehlungen:

Detaillierte Analyse von SFC und vue -loader in Vue

So übertragen Sie Werte zwischen übergeordneten und untergeordneten Vue-Komponenten

Das obige ist der detaillierte Inhalt vonSo aktualisieren Sie das Token in Vue. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1659
14
PHP-Tutorial
1258
29
C#-Tutorial
1232
24
So verwenden Sie Bootstrap in Vue So verwenden Sie Bootstrap in Vue Apr 07, 2025 pm 11:33 PM

Die Verwendung von Bootstrap in Vue.js ist in fünf Schritte unterteilt: Startstrap installieren. Bootstrap in main.js. Verwenden Sie die Bootstrap -Komponente direkt in der Vorlage. Optional: benutzerdefinierter Stil. Optional: Verwenden Sie Plug-Ins.

So fügen Sie Funktionen zu Schaltflächen für Vue hinzu So fügen Sie Funktionen zu Schaltflächen für Vue hinzu Apr 08, 2025 am 08:51 AM

Sie können der VUE -Taste eine Funktion hinzufügen, indem Sie die Taste in der HTML -Vorlage an eine Methode binden. Definieren Sie die Methode und schreiben Sie die Funktionslogik in der VUE -Instanz.

So verwenden Sie Watch in Vue So verwenden Sie Watch in Vue Apr 07, 2025 pm 11:36 PM

Mit der Watch -Option in Vue.js können Entwickler auf Änderungen in bestimmten Daten anhören. Wenn sich die Daten ändert, löst sich eine Rückruffunktion aus, um Aktualisierungsansichten oder andere Aufgaben auszuführen. Zu den Konfigurationsoptionen gehören unmittelbar, die festlegen, ob ein Rückruf sofort ausgeführt werden soll, und Deep, das feststellt, ob Änderungen an Objekten oder Arrays rekursiv anhören sollen.

Was bedeutet VUE Multi-Page-Entwicklung? Was bedeutet VUE Multi-Page-Entwicklung? Apr 07, 2025 pm 11:57 PM

VUE Multi-Page-Entwicklung ist eine Möglichkeit, Anwendungen mithilfe des Vue.js-Frameworks zu erstellen, in dem die Anwendung in separate Seiten unterteilt ist: Code-Wartung: Die Aufteilung der Anwendung in mehrere Seiten kann das Verwalten und Wartungsbereich erleichtern. Modularität: Jede Seite kann als separates Modul für eine einfache Wiederverwendung und den Austausch verwendet werden. Einfaches Routing: Die Navigation zwischen Seiten kann durch einfache Routing -Konfiguration verwaltet werden. SEO -Optimierung: Jede Seite hat eine eigene URL, die SEO hilft.

So kehren Sie von Vue zur vorherigen Seite zurück So kehren Sie von Vue zur vorherigen Seite zurück Apr 07, 2025 pm 11:30 PM

VUE.JS hat vier Methoden, um zur vorherigen Seite zurückzukehren: $ router.go (-1) $ router.back () verwendet & lt; Router-Link to = & quot;/& quot; Komponentenfenster.history.back () und die Methodenauswahl hängt von der Szene ab.

So verwenden Sie Vue Traversal So verwenden Sie Vue Traversal Apr 07, 2025 pm 11:48 PM

Es gibt drei gängige Methoden für Vue.js, um Arrays und Objekte zu durchqueren: Die V-für-Anweisung wird verwendet, um jedes Element zu durchqueren und Vorlagen zu rendern; Die V-Bind-Anweisung kann mit V-für dynamisch Attributwerte für jedes Element verwendet werden. und die .MAP -Methode kann Array -Elemente in Neuarrays umwandeln.

React vs. Vue: Welches Framework verwendet Netflix? React vs. Vue: Welches Framework verwendet Netflix? Apr 14, 2025 am 12:19 AM

NetflixuSesacustomframeworkcalted "Gibbon" Builtonreact, NotreactorVuedirect.1) TeamExperience: Wählen Sie beobädtes Vertrauen

So verweisen Sie auf die JS -Datei mit Vue.js So verweisen Sie auf die JS -Datei mit Vue.js Apr 07, 2025 pm 11:27 PM

Es gibt drei Möglichkeiten, sich auf JS -Dateien in Vue.js zu beziehen: Geben Sie den Pfad direkt mit dem & lt; Skript & gt an. Etikett;; Dynamischer Import mit dem montierten () Lebenszyklushaken; und importieren über die Vuex State Management Library.

See all articles