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 相关文章推荐
Windows Live的@live.com域名注册漏洞 利用代码
Dec 27 Javascript
代码精简的可以实现元素圆角的js函数
Jul 21 Javascript
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
Apr 15 Javascript
node.js中的buffer.toString方法使用说明
Dec 14 Javascript
基于jQuery创建鼠标悬停效果的方法
Mar 07 Javascript
浅谈js中的延迟执行和定时执行
May 31 Javascript
vue.js中指令Directives详解
Mar 20 Javascript
JS实现批量上传文件并显示进度功能
Jun 27 Javascript
Bootstrap图片轮播效果详解
Oct 17 Javascript
微信小程序入门之广告条实现方法示例
Dec 05 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
Aug 03 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
Dec 25 jQuery
详解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
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
2008/11/18 PHP
PHP 金额数字转换成英文
2010/05/06 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
ajax异步刷新实现更新数据库
2012/12/03 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
jQuery实现仿QQ头像闪烁效果的文字闪动提示代码
2015/11/03 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
快速解决element的autofocus失效问题
2020/09/08 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
一篇文章搞懂Python的类与对象名称空间
2018/12/10 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
资产评估专业大学生求职信
2013/09/29 职场文书
简历的自我评价
2014/02/03 职场文书
承诺书的格式范文
2014/03/28 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
离婚起诉书范本
2015/05/18 职场文书
春晚观后感
2015/06/11 职场文书
关于环保的宣传稿
2015/07/23 职场文书
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis