Egg框架搭建后端服务【5】- 接口token

需求

后端服务提供的接口应该是有时限和权限的,所以一般通过 token 进行用户权限的校验。

开发

安装

通过 egg-jwt 插件生成 token。

npm i --save egg-jwt

配置

在 plugin.js 中配置 egg-jwt 插件。

module.exports = {
   
    jwt: {
   
        enable: true,
        package: 'egg-jwt'
    },
};

在 config.default.js 中设置 jwt 相关内容,同时因为部分接口不需要校验 token,故在此处同时设置白名单。

// 添加jwt的配置
config.jwt = {
   
	secret: 'Jian1',  // 加密密钥
	sign: {
   
		expiresIn: 60 * 60 * 24,  // 过期时间24小时
		algorithm: 'HS256'
	}
}

// 添加token白名单配置
config.tokenWhiteList = [
	'/login',
	'/verifyCode',
]

生成

生成 token 的动作一般在调用 login 接口的时候进行,通过 login 接口将 token 传递给前端,一般保存在 localStore 中。

const token = app.jwt.sign(params, app.config.jwt.secret);
ctx.state = 200;
ctx.body = {
   
	code: 200,
	success: true,
	data: {
   token: token},
	msg: '欢迎回来,' + userInfo.name,
	show: true	
}

校验

egg框架存在 中间件(middleware) 非常适合全局性质的拦截和校验。

创建 app/middleware/tokenAuth.js 文件。

module.exports = () => {
   
    return async function (ctx, next) {
   
        const requestUrl = ctx.request.url;

        if (ctx.app.config.tokenWhiteList.indexOf(requestUrl) > -1) {
   
            // 当前路由在白名单中
            await next();
            return;
        }

        const userToken = ctx.request.headers['authorization'].replace(/^Bearer\s+/, '');

        if (userToken) {
   
            try {
   
                ctx.app.jwt.verify(userToken, ctx.app.config.jwt.secret);
                await next();
            } catch (e) {
   
                ctx.status = 401;
                return ctx.body = {
   
                    code: 401,
                    msg: 'token错误'
                }
                return;
            }
        } else {
   
            ctx.status = 401;
            return ctx.body = {
   
                code: 401,
                msg: 'token不存在'
            }
            return;
        }
    }
}

总结

token 是比较重要的校验方式,但是需要注意的是常规来说:

前端传递 token 的时候需要加上 "Bearer "。

后端解析的时候需要去除 "Bearer "。

这里涉及到的其实是 W3C 的规范,请求头 Authorization 验证身份的时候遵守的格式是 Authorization: <type> <credentials>

  • type 是认证方式
  • credentials 是认证信息

注意:这里前端不增加 "Bearer " 也是可以调通的,但是加上最好,原因是框架使然。详情可以参阅官方文档

相关推荐

  1. Egg框架服务5】- 接口token

    2024-01-19 14:08:02       40 阅读
  2. Egg框架服务【6】- 上传图片和图片回显

    2024-01-19 14:08:02       37 阅读
  3. egg管理服务

    2024-01-19 14:08:02       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-19 14:08:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-19 14:08:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-19 14:08:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-19 14:08:02       18 阅读

热门阅读

  1. linux c多个线程分段读取一个文件

    2024-01-19 14:08:02       32 阅读
  2. Vue 阻止事件冒泡

    2024-01-19 14:08:02       36 阅读
  3. Interface 接口

    2024-01-19 14:08:02       32 阅读