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 相关文章推荐
javascript while语句和do while语句的区别分析
Dec 08 Javascript
基于Jquery的动态添加控件并取值的实现代码
Sep 24 Javascript
IE不支持getElementsByClassName最终完美解决方案
Dec 17 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
Mar 16 Javascript
JavaScript必知必会(七)js对象继承
Jun 08 Javascript
jquery表单插件Autotab使用方法详解
Jun 24 Javascript
浅谈JS运算符&amp;&amp;和|| 及其优先级
Aug 10 Javascript
Vue数组更新及过滤排序功能
Aug 10 Javascript
详解Angular6.0使用路由步骤(共7步)
Jun 29 Javascript
jQuery层叠选择器用法实例分析
Jun 28 jQuery
小程序实现多个选项卡切换
Jun 19 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
Aug 03 Javascript
详解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
人族 TERRAN 概述
2020/03/14 星际争霸
针对初学PHP者的疑难问答(2)
2006/10/09 PHP
php检测文本的编码
2015/07/26 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
2013/12/19 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
Python实现一个简单的验证码程序
2017/11/03 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
Django 限制访问频率的思路详解
2019/12/24 Python
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
安全生产中长期规划实施方案
2014/02/21 职场文书
运动会班级口号
2014/06/09 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
赞助商致辞
2015/07/30 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
mysql联合索引的使用规则
2021/06/23 MySQL
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫