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 相关文章推荐
aspx中利用js实现确认删除代码
Jul 22 Javascript
在JavaScript并非所有的一切都是对象
Apr 11 Javascript
jQuery中fadeOut()方法用法实例
Dec 24 Javascript
AngularJS  $modal弹出框实例代码
Aug 24 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
Feb 05 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
Mar 14 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
Mar 28 jQuery
postman自定义函数实现 时间函数的思路详解
Apr 17 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
Apr 25 Javascript
taro开发微信小程序的实践
May 21 Javascript
Vue实现剪切板图片压缩功能
Feb 04 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
Mar 10 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
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
PHP开发大型项目的一点经验
2006/10/09 PHP
PHP 读取文件的正确方法
2009/04/29 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
js异或加解密效果代码
2008/06/25 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
jquery得到iframe src属性值的方法
2014/09/25 Javascript
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
python 提取文件的小程序
2009/07/29 Python
用实例解释Python中的继承和多态的概念
2015/04/27 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
golang/python实现归并排序实例代码
2020/08/30 Python
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
大学生毕业鉴定
2014/01/31 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
交通安全责任书范本
2014/07/24 职场文书
2014年维稳工作总结
2014/11/18 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
2016年安全月活动总结
2016/04/06 职场文书
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫