只需要高層概述如何構建此功能。 我有一個身份驗證js對象(es6類),實例化一次,並使用JWT。如何使用JWT處理Vuejs身份驗證的簡單高級概述
import { getRouteByName, getRouter } from 'appRouter'
import axios from 'axios'
let instance = null
class AppAuthentication {
constructor (http, router, localStorage = window.localStorage) {
if (!instance) {
instance = this
this.storage = localStorage
this.http = http
// this.router = router // but it will be undefined
this.api = http.create({baseURL: someURL, headers: {'Authorization':
'Bearer ' + this.token}})
this.watchRoutes()
}
return instance
}
watchRoutes() {
this.router.beforeEach((to, from, next) => {
let login = 'Login'
if (to.name !== login && this.isLoggedOut()) {
return next(getRouteByName(login))
}
next()
})
}
login (credentials) {
return this.http.post(`${SOME_URL}/login`, credentials)
}
finishAuthentication (token) {
this.setToken(token)
this.router.replace('/')
}
logout() {...}
set token (token) { ... }
get token() { ... }
get router:() => getRouter() // this sucks
isLoggedIn() {...}
isLoggedOut() {...}
}
export default new AppAuthentication(axios, router /*(here router will be undefined)*/)
問題是,該對象是在Vue路由器「準備好」之前實例化的,因此引用未定義。我有一個蹩腳的getter可以回到vue路由器。顯然這不是最好的方法。
我看到在應用程序中包含內容的reactJS域中的高級組件。沒有看到這樣的事情是真的。什麼是高層次的做法呢?
像這樣的方式來做到這一點?
<app>
<authentication>
<some-tag></some-tag>
<router-view></router-view>
</authentication>
</app>
最後我做了一個auth對象,它把路由器和存儲作爲一個依賴關係。它處理與localstorage的接口,並且只在用戶登錄時才發佈給vuex一個布爾值。這與你所說的並不遙遠。這是一個廣泛的問題......所以你爲自己贏得了一個機會。 – Simon
@Simon,謝謝。我會說,根據我的經驗,您希望將令牌保存到狀態而不是本地存儲。我做了一個並排的比較,它使用本地存儲要慢得多,我不得不像從API中拉出來一樣對待它。例如,我所從事的一個應用程序需要高安全性,並在每次請求時更改標記。從本地存儲中存儲並拉出它不起作用,因爲寫入和讀取的延遲時間足以使它有時無法獲得正確的標記,或者其他時間會回到空白。總的來說,我的經驗是Vue對於本地存儲「太快」了 –