Cookie Session和登录验证
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、cookie是什么?
- 存贮在浏览器的一段字符,最大5kb, 上限20条,看浏览器设置。
- 每一个域都可以有一个cookie,跨域不共享
- 格式key = val;key = val(可以格式化)
- cookie随http请求传递给服务器,所以cookie要小,在request headers 里
- 服务端可修改cookie,在返回 response header set-cookie
- 默认跨域不可以传递cookie,但是可以跨域传递
const http = require('http')
const server = http.createServer((req, res) =>{
res.setHeader('Set-Cookie', 'a=200')
console.log(req.headers.cookie)
const cookieStr = req.headers.cookie
const cookiesObj = {}
cookieStr.split(';').forEach(item => {
const arr = item.trim().split('=')
const key = arr[0]
const val = arr[1]
cookiesObj[key] = val;
})
console.log(cookiesObj)
res.end('cookie test')
})
koa设置cookie
const koa = require('koa')
const app = new koa()
app.use(async (ctx) => {
ctx.cookies.set('a', '100')
console.log(ctx.cookies.get('a'))
ctx.body = 'cookie test by Koa2'
})
cookie用于登录校验
- 请求接口,成功则设置cookie,eg:user = zhangsan
- 再次请求就会带着cookie
- 服务端判断有无cookie即可验证
二、session是什么?
- cookie不能暴露用户名,或者存放信息明文
- cookie保存用户标识 eg: userId = 123
- 用户信息存储到session中,和cookie一一对应
- session可以存在数据库,或者一个对象没有具体要求
- 登录成功后在session中加入cookie的id和相关信息。
三 登录验证的过程
使用 koa-generic-session
配置
const session = require('koa-generic-session')
app.keys = ['session-koa2123123']//密钥
//登录就设置cookie
app.use(session({
cookie: {
path: '/',//根目录有效
httpOnly: true,//只有服务器能操作
maxAge: 24 * 60 * 60 * 1000//时间一天
}
}))
模拟登陆
let str = ''
router.get('/login-mock', async (ctx, next) => {
const query = ctx.query
//假设有userna就算成功
if (query.username) {
ctx.session.userInfo = {
username: query.username
}
str = 'ok'
} else {
str = 'fail'
}
ctx.body = str
})
router.get('/login-check-mock', async (ctx, next) => {
ctx.body = ctx.session.userInfo || {}
})
对接数据库
const { User } = require('../db/model')
router.get('/login', async (ctx, next) => {
const { username, password } = ctx.query
//const { username, password} = ctx.request.body //post请求
const user = await User.findOne({
username,
password
})
if (user != null) {
ctx.session.userInfo = user
ctx.body = {
errno: 0,
data: user
}
return
}
ctx.body = {
errno: -1,
msg: '用户名错误'
}
})
总结
可以把登录封装成中间件
async function loginCheck (ctx, next) {
const userInfo = ctx.session.userInfo
if(userInfo && userInfo.username){
await next()
return
}
ctx.body = {
errno: -1,
msg: '请登录'
}
}
module.exports = loginCheck
对应router引入
router.get('/list', loginCheck, async (ctx) => {
const query = ctx.query
console.log(query)
const commentList = await Comment.find().sort({_id: -1})
ctx.body = {
errno:0,
data: commentList
}
})
先校验然后执行后续操作