Nuxt.js SSR與權(quán)限驗(yàn)證的實(shí)現(xiàn)
Nuxt.js是一個(gè)建立在Vue.js基礎(chǔ)上的服務(wù)端渲染框架。它非常易于上手并且可以讓你在幾分鐘內(nèi)構(gòu)建你的應(yīng)用。
服務(wù)端渲染是一個(gè)解決所有SPA的SEO問(wèn)題的偉大解決方案,但不幸的是它帶來(lái)了另一個(gè)問(wèn)題:權(quán)限驗(yàn)證成了另一個(gè)項(xiàng)目管理中的痛點(diǎn)。
Nuxt.js官網(wǎng)提供了一個(gè)稱為“路由鑒權(quán)”的示例(https://nuxtjs.org/examples/auth-routes)。它展示了如何通過(guò)一個(gè)中間件來(lái)限定一個(gè)頁(yè)面是否可訪問(wèn),但是這個(gè)檢查是在客戶端的進(jìn)行的并且服務(wù)端渲染出的內(nèi)容無(wú)論是否進(jìn)行權(quán)限驗(yàn)證都是一樣的。
那么我們?nèi)绾卧诜?wù)端渲染一個(gè)特定的內(nèi)容呢?這里有一個(gè)解決方案!
服務(wù)端渲染通常是這樣進(jìn)行的:客戶端發(fā)起一個(gè)請(qǐng)求,例如訪問(wèn)“/articles/page/1”,服務(wù)端渲染框架訪問(wèn)一個(gè)返回JSON數(shù)據(jù)的API然后生成頁(yè)面并將其發(fā)送至客戶端。
我們?cè)谶@個(gè)過(guò)程中缺少的是指定一個(gè)token或者其他什么來(lái)進(jìn)行權(quán)限驗(yàn)證的過(guò)程?;蛟S一個(gè)包含權(quán)限token的Cookie是一個(gè)好辦法,它能在頭部被讀取,因此我們的服務(wù)端渲染框架能傳遞它或是把它發(fā)送到API。
首先我們要?jiǎng)?chuàng)建兩個(gè)插件:
import axios from 'axios'
let options = {};
if (process.SERVER_BUILD) {
options.baseURL = `http://api:3030`
}
let ax = {
options,
create: (token) => {
options.headers = {
Authorization: token
}
return axios.create(ax.options)
}
}
export default ax
這個(gè)插件能讓我們通過(guò)Axios發(fā)送帶token的請(qǐng)求。
const getCookie = function(cname, req) {
let name = cname + "="
let decodedCookie
if (typeof window === 'undefined') decodedCookie = decodeURIComponent(req.headers.cookie)
else decodedCookie = decodeURIComponent(document.cookie)
let ca = decodedCookie.split(';')
for(let i = 0; i <ca.length; i++) {
let c = ca[i]
while (c.charAt(0) == ' ') {
c = c.substring(1)
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length)
}
}
return ""
}
export default getCookie
這一個(gè)插件則是從Cookie中獲取token。
接下來(lái)你就能在一個(gè)“async fetch”方法中簡(jiǎn)單地使用它們:
import axios from '~plugins/axios'
import getCookie from '~plugins/getCookie'
export default {
async fetch ({ store, isServer, req, redirect }) {
if(isServer) {
const ax = axios.create(getCookie('token', req))
try {
let { data } = await ax.get('/populate')
if(data.store && data.store.user) store.commit('user/setData', data.store.user)
else redirect('/login')
} catch(e) {}
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談Vue路由快照實(shí)現(xiàn)思路及其問(wèn)題
這篇文章主要介紹了淺談Vue路由快照實(shí)現(xiàn)思路及其問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Vue實(shí)現(xiàn)數(shù)字輸入框中分割手機(jī)號(hào)碼的示例
本篇文章主要介紹了Vue實(shí)現(xiàn)數(shù)字輸入框中分割手機(jī)號(hào)碼的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
vue中如何實(shí)現(xiàn)pdf文件預(yù)覽的方法
這篇文章主要介紹了vue中如何實(shí)現(xiàn)pdf文件預(yù)覽的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
vue通過(guò)獲取url中的信息登錄頁(yè)面的代碼詳解
這篇文章主要給大家介紹了vue通過(guò)獲取url中的信息登錄頁(yè)面的方法,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-02-02
解決vue項(xiàng)目打包上服務(wù)器顯示404錯(cuò)誤,本地沒(méi)出錯(cuò)的問(wèn)題
這篇文章主要介紹了解決vue項(xiàng)目打包上服務(wù)器顯示404錯(cuò)誤,本地沒(méi)出錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
vue3版本網(wǎng)頁(yè)小游戲設(shè)計(jì)思路
最近火爆全網(wǎng)的羊了個(gè)羊小程序,背景是根據(jù)官方介紹,“羊了個(gè)羊”是一款闖關(guān)消除小游戲,通關(guān)率不到0.1%。主要玩法為重疊的各類方塊,需要在下方7個(gè)欄內(nèi)完成消除,其特點(diǎn)就是“極難”,也因此成為熱門(mén)挑戰(zhàn),對(duì)vue3版本網(wǎng)頁(yè)小游戲設(shè)計(jì)思路感興趣的朋友跟隨小編一起看看吧2022-12-12
vue3子組件數(shù)據(jù)無(wú)法更新問(wèn)題
這篇文章主要介紹了vue3子組件數(shù)據(jù)無(wú)法更新問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
vue測(cè)試環(huán)境打包與生產(chǎn)環(huán)境打包文件數(shù)量不一致解決方案
這篇文章主要為大家介紹了vue測(cè)試環(huán)境打包與生產(chǎn)環(huán)境打包文件數(shù)量不一致的解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

