博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
koa2实现session-cookie和token的鉴权
阅读量:6244 次
发布时间:2019-06-22

本文共 2519 字,大约阅读时间需要 8 分钟。

前后端鉴权一直是web开发的常见问题,今天就用一个demo来总结下常见的session和token鉴权方式。

session鉴权

我们用代码来说明。

session-cookie鉴权关键的一点是在服务端保存session,我们这边用redis进行保存,然后给客户端发送cookie。当客户端访问服务端时,携带cookie,而这cookie就是redis保存session的key,能拿到对应的session就证明客户端有权限访问服务端的api,否在就是非法访从而拒绝,要求登录验证身份后才能发起访问。

而在koa2中实现session的存取鉴定,我们可以把该过程封装成一个中间件,然后在路由请求响应前响应就行了。

具体的可以看代码和其中的注释。

module.exports = function (opts = {}) {  opts.key = opts.key || "cookieKey";    return async function (ctx, next) {      let cookie = ctx.cookies.get(opts.key, opts);     // cookie是否存在        if (cookie) {             // 删除cookie,为了在下一步重置cookie的时间    ctx.cookies.set(opts.key, cookie, {maxAge: -1});            // 如果session存在,删除redis的session为了在下一步重置session的时间          ctx.session = await opts.store.get(cookie);             if(ctx.session) {                   // 删除redis的值                opts.store.destroy(cookie);         }       } else {          ctx.session = undefined     }        await next();        // 有权限的操作或者登录       if (ctx.session) {            // 更新session时间或者存放新的session      let newCookie = await opts.store.set(ctx.session, Object.assign({}, opts, {sid: cookie}));           // 更新cookie的时间              ctx.cookies.set(opts.key, newCookie, opts);    }    }};复制代码

token鉴权

token的话,只要在登录的时候生成token返回客户端,然后客户端请求时携带token即可完成验证操作。在koa2中使用jsonwebtoken插件进行token的生成和验证。具体可以看下代码。

const jwt = require('jsonwebtoken');const baseConfig = require('../config/basice.js');复制代码
module.exports.createToken = function (userName) {    return jwt.sign(        {userName},        baseConfig.jwtSecretKey,        {expiresIn: baseConfig.expiresIn}    );};module.exports.checkToken = function (ctx, next) {    let token = ctx.headers['client-token'];    if (!token) {        ctx.body = {            success: false,            error: {                code: 401,                message: 'token不能为空'            }        };    } else {        jwt.verify(token, baseConfig.jwtSecretKey, async function (err) {                if (err) {                    let message;                    if (err.name === 'TokenExpiredError') {                        message = 'token已过期';                    } else {                        message = 'token无效';                    }                    ctx.body = {                        success: false,                        error: {                            code: 401,                            message                        }                    };                } else {                    return await next();                }            }        );    }};复制代码

全部代码:

转载地址:http://utvia.baihongyu.com/

你可能感兴趣的文章
为什么我要垂直对齐代码(你也要如此!)
查看>>
《ANSYS Workbench 16.0超级学习手册》——1.4 本章小结
查看>>
微软确认周二更新补丁破坏了 Windows 10 重置功能
查看>>
《Cisco防火墙》一8.4 入站NAT分析
查看>>
流处理框架 Samza 成为 Apache 基金会顶级项目
查看>>
《腾讯iOS测试实践》一一3.4 测试原则
查看>>
结对编程 VS 代码审查:对比开发者文化
查看>>
用消除重复的加密工具备份数据
查看>>
《电路分析导论(原书第12版)》一1.4.1 算法语言
查看>>
PNG 图片处理库 libpng 曝出漏洞,已初步修复
查看>>
Go 开发的 IM 和推送服务 goim
查看>>
高危漏洞预警:WordPress Core 多个高危漏洞
查看>>
《DNS与BIND(第5版)》——1.5 一定要使用DNS吗
查看>>
"挖掘机指数"告诉你不一样的中国经济
查看>>
看麦肯锡如何分析中国城市群
查看>>
《数据分析变革:大数据时代精准决策之道》一1.4 全面看待运营型分析
查看>>
一分钟自我介绍:阿里云CDN
查看>>
《iOS 8开发指南》——第6章,第6.5节实战演练——使用模板Single View Application...
查看>>
【观点】离开了信息化,大数据就是为他人作嫁衣
查看>>
《HTML5+CSS3网页设计入门必读》——1.4 分裂:WHATWG TF
查看>>