Cookie Session和登录验证


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、cookie是什么?

  1. 存贮在浏览器的一段字符,最大5kb, 上限20条,看浏览器设置。
  2. 每一个域都可以有一个cookie,跨域不共享
  3. 格式key = val;key = val(可以格式化)
  4. cookie随http请求传递给服务器,所以cookie要小,在request headers 里
  5. 服务端可修改cookie,在返回 response header set-cookie
  6. 默认跨域不可以传递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是什么?

  1. cookie不能暴露用户名,或者存放信息明文
  2. cookie保存用户标识 eg: userId = 123
  3. 用户信息存储到session中,和cookie一一对应
  4. session可以存在数据库,或者一个对象没有具体要求
  5. 登录成功后在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
    }
})

先校验然后执行后续操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值