Nuxt.js SSR与权限验证的实现


Posted in Javascript onNovember 21, 2018

Nuxt.js是一个建立在Vue.js基础上的服务端渲染框架。它非常易于上手并且可以让你在几分钟内构建你的应用。

服务端渲染是一个解决所有SPA的SEO问题的伟大解决方案,但不幸的是它带来了另一个问题:权限验证成了另一个项目管理中的痛点。

Nuxt.js官网提供了一个称为“路由鉴权”的示例(https://nuxtjs.org/examples/auth-routes)。它展示了如何通过一个中间件来限定一个页面是否可访问,但是这个检查是在客户端的进行的并且服务端渲染出的内容无论是否进行权限验证都是一样的。

那么我们如何在服务端渲染一个特定的内容呢?这里有一个解决方案!

服务端渲染通常是这样进行的:客户端发起一个请求,例如访问“/articles/page/1”,服务端渲染框架访问一个返回JSON数据的API然后生成页面并将其发送至客户端。

我们在这个过程中缺少的是指定一个token或者其他什么来进行权限验证的过程。或许一个包含权限token的Cookie是一个好办法,它能在头部被读取,因此我们的服务端渲染框架能传递它或是把它发送到API。

首先我们要创建两个插件:

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

这个插件能让我们通过Axios发送带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

这一个插件则是从Cookie中获取token。

接下来你就能在一个“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) {}
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Mootools 1.2教程 类(一)
Sep 15 Javascript
JavaScript中的无阻塞加载性能优化方案
Oct 10 Javascript
jQuery超酷平面式时钟效果代码分享
Mar 30 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
May 23 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
Jan 20 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
Feb 14 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
基于vue2.0实现的级联选择器
Jun 09 Javascript
webpack 插件html-webpack-plugin的具体使用
Apr 09 Javascript
javascript中的闭包概念与用法实践分析
Jul 26 Javascript
在VUE中使用lodash的debounce和throttle操作
Nov 09 Javascript
vue 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
详解nuxt路由鉴权(express模板)
Nov 21 #Javascript
使用vue-cli webpack 快速搭建项目的代码
Nov 21 #Javascript
Angular刷新当前页面的实现方法
Nov 21 #Javascript
详解ES6系列之私有变量的实现
Nov 21 #Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 #jQuery
Vue.js 中 axios 跨域访问错误问题及解决方法
Nov 21 #Javascript
vue  directive定义全局和局部指令及指令简写
Nov 20 #Javascript
You might like
php MessagePack介绍
2013/10/06 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
Angularjs 基础入门
2014/12/26 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
Python 命令行参数sys.argv
2008/09/06 Python
python实现socket客户端和服务端简单示例
2014/02/24 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
先进个人事迹材料
2014/01/25 职场文书
高中打架检讨书
2014/02/13 职场文书
安全标准化实施方案
2014/02/20 职场文书
小组名称和口号
2014/06/09 职场文书
工作求职信
2014/07/04 职场文书
学校实习推荐信
2015/03/27 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书
Python 数据可视化之Seaborn详解
2021/11/02 Python
springboot中的pom文件 project报错问题
2022/01/18 Java/Android
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android