鉴权

目录

  • cookie-session模式
    • session源码实现
    • koa session
    • Redis 全局session
  • token JWT模式
    • JWT原理
    • koa JWT
    • 优势
  • 扩展
    • oauth2(第三方登录)
    • oss(单点登录)

cookie-session模式

  1. session源码实现

cookie是什么

  • 服务器通过Set-Cookie 响应头设置Cookie
  • 浏览器得到Cookie后,每次请求会自动带上Cookie
  • 服务器读取Cookie就知道登录用户的信息(req.header.cookie)
/**
 * cookie测试
 * 内存cookie:不设置过期时间默认是存在浏览器的内存中,浏览器关闭后自动清除
 * 硬盘cookie:是指在你设置了cookie的Expires属性(即过期时间),此时cookie将保存到你的硬盘上,过期时间到了会自动清除或者手动清除
 */
const http = require('http')

http.createServer((req, res) => {
    if (req.url === '/favicon.ico') return

    console.log(req.headers.cookie)

    // cookie设置过期时间后,浏览器会在30秒后自动清除
    // let exp = new Date();
    // exp.setTime(exp.getTime() + 30 * 1000);//过期时间30秒
    // res.setHeader('Set-Cookie', 'cookie1=a;expires=' + exp.toGMTString())

    //不设置cookie过期时间 浏览器关闭后自动清除
    res.setHeader('Set-Cookie', 'cookie1=a')
    res.end('hello')
})
    .listen(3000)

什么是session, cookie和session的区别是什么?

/**
 * session 测试
 * session是依赖Cookie实现的。session是服务器端对象
 * 自己的见解:session就是将用户的敏感信息存储在服务器中,通过将对应的sid保存在cookie中
 * 用户在发送请求时携带带有sid的cookie,服务器拿到sid,就可以得到相应的用户信息
 * session的局限性:在数据共享,跨域,集群服务器上难以施展
 * 解决方案:
 * 1. session 数据持久化,写入数据库或别的持久层。如Redis键值对数据库,这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。
 * 2.JWT 一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。
 * 
 */

const http = require('http')

//新建服务器对象
const session = {}

http.createServer((req, res) => {
    if (req.url === '/favicon.ico') return

    console.log(req.headers.cookie)
    const sessionKey = 'sid'
    const cookie = req.headers.cookie

    // 如果有session
    if (cookie && cookie.indexOf(`${sessionKey}`) > -1) {
        res.end('Come Back!')
        //从cookie中提取sid,然后通过sid查询对应的用户数据
        const pattern = new RegExp(`${sessionKey}=([^;]+);?\s*`)
        const sid = pattern.exec(cookie)[1]
        console.log('session:', sid, session, session[sid])
    } else {
        const sid = (Math.random() * 9999999999).toFixed()
        res.setHeader('Set-Cookie', `${sessionKey}=${sid}`)
        //在服务器对象session中,根据索引sid来填充数据
        session[sid] = {
            name: '柳絮才媛'
        }
        res.end('第一次')
    }
    res.end('hello')
})
    .listen(3000)
  1. koa

你可能感兴趣的:(node,jwt,redis,session,oauth,sso)