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

So aktualisieren Sie das Token in Vue

不言
Freigeben: 2018-07-21 11:57:37
Original
3055 Leute haben es durchsucht

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!

Verwandte Etiketten:
vue
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage