2020-10-09 TARGET个人博客

module.exports和exports的区别

module.exports和exports其实是一个东西,exports如果是指向值类型,那么这两者相等,如果exports指向引用类型,那么这两者就不同。

什么是值类型,什么是引用类型? 值类型存储在栈中,引用类型存储在堆中,值类型赋值的时候,会在栈中拷贝一份,就不会对原来那一份有影响,但是引用类型会改变

用户鉴权

两种方式,一种是session,后端获取登录用户后,生成session存储在redis数据库中,交给前端后,前端每次把session携带在cookie中,WJ项目使用的就是这种鉴权方式,这种鉴权方式适合在前后端不分离的情况下,因为携带cookie可能会存在跨域问题

第二种方式是JWT,请求后端以后,后端生成一个token给前端,然后前端在需要鉴权的请求中携带token,携带方式为:header: { Authorization: {token} } 请求头中这个字段默认是用来获取用户身份的。第二种方法就适用于前后端分离的项目

jsonwebtoken

用户鉴权登录的流程为:每次登录刷新token,前端登陆后,把token放在请求头的header[‘Authorization’]中,然后在需要的时候带上,后端接收到token,验证token是否过期,如果过期反馈给前端,如果没有过期,可以根据token解析出用户的id然后获取用户信息

const jwt = require('jsonwebtoken')
const key = 'nasig345#$n34&^h*523j4k24&$%@'
let result = require('../models/result.js')

/**
 * 检查token是否过期
 */
module.exports = async (ctx) => {
    
    
	const authorization = ctx.get('Authorization')
	if(authorization === '') {
    
    
		ctx.body = new result.ErrorModel(401, '暂无token或token失效')
	}
	const token = authorization
	try {
    
    
		await jwt.verify(token, key, (err, data) => {
    
    
			if(err) {
    
    
				switch(err.name) {
    
    
					case 'JsonWebTokenError':
						ctx.body = new result.ErrorModel(401, '暂无token或token失效')
						break;
					case 'TokenExpiredError': 
						ctx.body = new result.ErrorModel(401, '暂无token或token失效')
				}
			} else {
    
    
				ctx.body = new result.SuccessModel(200, '操作成功', token)
			}
		})
	} catch(err) {
    
    
		ctx.body = new result.ErrorModel(401, '暂无token或token失效')
	}
	
	return user_id = JSON.stringify(jwt.decode(token))
}

猜你喜欢

转载自blog.csdn.net/qq_48886692/article/details/120678733