【nuxt|nuxt系列【二】用户登录存储用户信息和token,实现权限认证】Nuxt.js是基于在Vue.js的服务端渲染框架,能完美的解决SEO的问题,但同时权限认证成为了一大痛点,需要解决用户登录后,保存token,来验证后续的权限的问题。
解决方法:利用js-cookie 保存token,这样能在token能在头部被获取,同时并用vuex,将token和用户信息存储在store中。
1.登录操作
const Cookie = process.client ? require('js-cookie') : undefined// 获取token
getToken() {
let vm = this
// 这里将axios 做了一些封装
User.userLogin.request(this.form, (res) => {
let token = res.data['token']
vm.$store.commit('setAuth', token)
Cookie.set('auth', token)
vm.getUserInfo()
}, (error) => {
vm.$notify.error({title: '请输入正确的用户名和密码!'})
})
},
// 获取用户信息
getUserInfo() {
let vm = this
User.userInfo.request((res) => {
let data = https://www.it610.com/article/res.data
if (data) {
vm.$store.commit('setUser', data)
vm.$router.push('/reading-list')
}
})
},
2.中间件authenticated.js
由于store 里面的数据刷新后清空,所以添加中间件,重新设置store数据。如果头部不含用户信息,即cookie失效则重新登录。
import getCookie from '@/config/get-cookie'export default function ({store, route, redirect, req}) {
// If the user is not authenticated
const {auth} = getCookie(req)
if (auth) {
store.commit('setAuth', auth)
return store.dispatch('getUserInfo')
}
const routePath = route.path
const extraPath = ['/']
if ((!store.state.auth) && extraPath.indexOf(routePath) === -1) {
// 跳转到登录页面
return redirect('/')
}
}
在nuxt.config.js 中使用中间件
router: {
middleware: ['authenticated'],
}
3.store/index.js
添加nuxtServerInit函数
nuxtServerInit({commit, state}, {req}) {
//console.log('nuxt init')
// console.log(req.headers.cookie)
let auth = null
if (req.headers.cookie) {const parsed = cookieparser.parse(req.headers.cookie)
try {
auth = JSON.parse(parsed.auth)
} catch (err) {
// No valid cookie found
}
commit('setAuth', auth)
}
},
4.axios 拦截器添加token到header中
let token = Cookie.get('auth')
// console.log(token)
if (token) {
config.headers = {
'Authorization': `Token ${token}`
}
}
demo参考:https://github.com/liuzhumin/nuxt-demo.git
推荐阅读
- 操作系统|[译]从内部了解现代浏览器(1)
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- vue.js|vue中使用axios封装成request使用
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历
- JavaScript|JavaScript — call()和apply()、Date对象、Math、包装类、字符串的方法
- JavaScript|JavaScript之DOM增删改查(重点)
- javascript|vue使用js-xlsx导出excel,可修改格子样式,例如背景颜色、字体大小、列宽等
- javascript|javascript中的数据类型转换