Nuxt.js SSR與權(quán)限驗(yàn)證

原文Nuxt.js?—?SSR & Authentication

Nuxt.js是一個(gè)建立在Vue.js基礎(chǔ)上的服務(wù)端渲染框架。它非常易于上手并且可以讓你在幾分鐘內(nèi)構(gòu)建你的應(yīng)用。

服務(wù)端渲染是一個(gè)解決所有SPA的SEO問題的偉大解決方案,但不幸的是它帶來了另一個(gè)問題:權(quán)限驗(yàn)證成了另一個(gè)項(xiàng)目管理中的痛點(diǎn)。

Nuxt.js官網(wǎng)提供了一個(gè)稱為“路由鑒權(quán)”的示例(https://nuxtjs.org/examples/auth-routes)。它展示了如何通過一個(gè)中間件來限定一個(gè)頁面是否可訪問,但是這個(gè)檢查是在客戶端的進(jìn)行的并且服務(wù)端渲染出的內(nèi)容無論是否進(jìn)行權(quán)限驗(yàn)證都是一樣的。

那么我們?nèi)绾卧诜?wù)端渲染一個(gè)特定的內(nèi)容呢?這里有一個(gè)解決方案!

服務(wù)端渲染通常是這樣進(jìn)行的:客戶端發(fā)起一個(gè)請求,例如訪問“/articles/page/1”,服務(wù)端渲染框架訪問一個(gè)返回JSON數(shù)據(jù)的API然后生成頁面并將其發(fā)送至客戶端。

我們在這個(gè)過程中缺少的是指定一個(gè)token或者其他什么來進(jìn)行權(quán)限驗(yàn)證的過程?;蛟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è)插件能讓我們通過Axios發(fā)送帶token的請求。

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。
接下來你就能在一個(gè)“async fetch”方法中簡單地使用它們:

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) {}
    }
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容