koa2-JWT登录验证、上传图片、上传视频、允许跨域


在这里插入图片描述

什么是JWT?怎么使用?

JWT(JSON Web Token),本质就是一个字符串书写规范,如下图,作用是用来在用户和服务器之间传递安全可靠的信息

Koa 中间件,用于验证 JSON Web 令牌。

npm i koa-jwt -s

生成签名

npm i jsonwebtoken -s

后端进行token处理,传递给前端

// 生成token
            const token = jwt.sign(
                {
                    name: result.name
                },
                "test_token", // secret
                {expiresIn: 60 * 60} // 过期时间:60 * 60 s
            );
            return ctx.body = {
                code: "0",
                message: "登录成功",
                data: {
                    token
                }
            };

完整代码
数据库用户密码我采用的加密存储,可以看情况而定

const crypto = require("crypto"),
    jwt = require("jsonwebtoken");
const UserService = require('../service/user')

class UserController {
    // 用户登录
    static async login(ctx) {
        let data = JSON.parse(ctx.request.body)
        if (!data.name || !data.password) {
            return ctx.body = {
                code: "000002",
                message: "参数不合法"
            }
        }
        let temp = {
            name: data.name,
            password: crypto.createHash('md5').update(data.password).digest('hex')
        }
        let res = await UserService.findUser(temp)
        // res就是从数据库查询的结果
        let result = res.length ? true : false
        if (result) {
            // 生成token
            const token = jwt.sign(
                {
                    name: result.name
                },
                "test_token", // secret
                {expiresIn: 60 * 60} // 过期时间:60 * 60 s
            );
            return ctx.body = {
                code: "0",
                message: "登录成功",
                data: {
                    token
                }
            };
        } else {
            return ctx.body = {
                code: "000002",
                message: "用户名或密码错误"
            };
        }
    }

    // 用户退出登录
    static userOut(ctx) {
        ctx.body = {
            code:200,
            data:{
                msg:'退出登录成功'
            }
        }
    }

}

module.exports = UserController;

Token的使用分成了两部分

生成token:登录成功的时候,颁发token
验证token:访问某些资源或者接口时,验证token
生成 token
借助第三方库jsonwebtoken,通过jsonwebtoken 的 sign 方法生成一个 token:

第一个参数指的是 Payload

第二个是秘钥,服务端特有

第三个参数是 option,可以定义 token 过期时间

前端的处理处理token

在这里插入图片描述
然后存储起来
之后的请求,都会携带该token,也可以用postman存在环境中,也是挺好模拟的
在这里插入图片描述

后端处理携带和不携带token的请求

这里需要借用koa-jwt中间件,并添加白名单,就是不用携带token

const jwt = require('koa-jwt')
app.use(jwt({ secret: 'test_token' }).unless({path:'/user/login'}));

这个过程我写的比较简略,有错误欢迎指正

上传图片

参考我的另一个博客

multer详解

上传视频

会持续更新

允许跨域

koa2 实现对post请求的跨域资源共享,只需加入如下中间件即可:

app.use(async (ctx, next)=> {
  ctx.set('Access-Control-Allow-Origin', '*');
  ctx.set('Access-Control-Allow-Headers', 'Content-Type');
  ctx.set('Access-Control-Allow-Methods', 'POST');
  await next();
});

如果只有 ctx.set(‘Access-Control-Allow-Origin’, ‘*’); 是不行的,因为post
请求,请求头会有 Content-Type, 必须在服务端加上处理 同样也得加上请求方式的处理
ctx.set(‘Access-Control-Allow-Methods’, ‘POST’);

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刮刮乐打工仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值