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 相关文章推荐
对YUI扩展的Gird组件 Part-1
Mar 10 Javascript
表单元素事件 (Form Element Events)
Jul 17 Javascript
为超链接加上disabled后的故事
Dec 10 Javascript
jQuery的cookie插件实现保存用户登陆信息
Apr 15 Javascript
node.js实现BigPipe详解
Dec 05 Javascript
jquery实现侧边弹出的垂直导航
Dec 09 Javascript
javascript表单事件处理方法详解
May 15 Javascript
详解JavaScript中this关键字的用法
May 26 Javascript
jQuery 3.0 的 setter和getter 模式详解
Jul 11 Javascript
vue 使用Jade模板写html,stylus写css的方法
Feb 23 Javascript
通过js给网页加上水印背景实例
Jun 17 Javascript
vue实现从外部修改组件内部的变量的值
Jul 30 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
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
php调用google接口生成二维码示例
2014/04/28 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
javascript各种复制代码收集
2008/09/20 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
javascript的BOM
2016/05/03 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
Python2 与Python3的版本区别实例分析
2020/03/30 Python
python如何查看网页代码
2020/06/07 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
python中if嵌套命令实例讲解
2021/02/25 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
C语言基础笔试题
2013/04/27 面试题
管理部部长岗位职责
2013/12/05 职场文书
通信工程专业毕业生推荐信
2013/12/25 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
应届生求职信范文
2014/05/26 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
吴仁宝观后感
2015/06/09 职场文书
Python机器学习之基础概述
2021/05/19 Python