Node.js的Koa实现JWT用户认证方法

前端之家收集整理的这篇文章主要介绍了Node.js的Koa实现JWT用户认证方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文介绍了Node.js的Koa实现JWT用户认证方法分享给大家,具体如下:

一、前置知识

@H_403_11@
  • nofollow" target="_blank" href="http://www.ruanyifeng.com/blog/2017/08/koa.html">Koa 框架教程
  • 二、环境

    @H_403_11@
  • Microsoft Visual Studio 2017集成开发环境
  • Node.js v8.9.4Javascript运行环境
  • 三、开始动手,一步步来完善

    1、创建基础的静态资源服务器、基础架构

    以下是基本的代码,实现静态服务器,以及一个当token验证异常时候的处理。

    下面我们将在这个基本代码下逐步增加注册登录、信息的功能

    / jwt密钥 /
    const secret = 'secret';

    / 当token验证异常时候的处理,如token过期、token错误 /
    app.use((ctx,next) => {
    return next().catch((err) => {
    if (err.status === 401) {
    ctx.status = 401;
    ctx.body = {
    ok: false,msg: err.originalError ? err.originalError.message : err.message
    }
    } else {
    throw err;
    }
    });
    });

    / 查询字符串解析到ctx.request.query /
    app.use(koaBody());

    / 路由权限控制 /
    // 待办事项……

    / POST /api/register 注册 /
    // 待办事项……

    / GET /api/login 登录 /
    // 待办事项……

    / GET /api/info 信息 /
    // 待办事项……

    / 静态资源处理 /
    app.use(serve(path.join(__dirname,'static')));
    / 监听服务器端口 /
    app.listen(website.port,() => {
    console.log(${website.join()} 服务器已经启动!);
    });

    下面,我们将在注册登录、信息的注释底下添加实现的代码

    2、路由权限控制

    注册登录接口、其它资源不需要认证,信息接口需要认证。

    3、注册

    { const body = ctx.request.body; /* * body = { * user : '御焱',* password : '123456' * } */

    // 判断 body.user 和 body.password 格式是否正确
    // 待办事项……

    // 判断用户是否已经注册
    // 待办事项……

    // 保存到新用户数据库
    // 待办事项……

    // 是否注册成功
    let 是否注册成功 = true;
    if (是否注册成功) {
    // 返回一个注册成功的JOSN数据给前端
    return ctx.body = {
    ok: true,msg: '注册成功',token: getToken({ user: body.user,password: body.password })
    }
    } else {
    // 返回一个注册失败的JOSN数据给前端
    return ctx.body = {
    ok: false,msg: '注册失败'
    }
    }
    }));
    / 获取一个期限为4小时的token /
    function getToken(payload = {}) {
    return jwt.sign(payload,secret,{ expiresIn: '4h' });
    }

    3、登录

    { const query = ctx.request.query; /* * query = { * user : '御焱',* password : '123456' * } */

    // 判断 query.user 和 query.password 格式是否正确
    // 待办事项……

    // 判断是否已经注册
    // 待办事项……

    // 判断姓名、学号是否正确
    // 待办事项……

    return ctx.body = {
    ok: true,msg: '登录成功',token: getToken({ user: query.user,password: query.password })
    }
    }));

    前端获取到token之后,可以保存在任意本地存储里。

    4、信息

    { // 前端访问时会附带token在请求头 payload = getJWTPayload(ctx.headers.authorization) /* * payload = { * user : "御焱",* iat : 1524042454,* exp : 1524056854 * } */

    // 根据 payload.user 查询用户数据库中的信息
    // 待办事项……
    const info = {
    name: '御焱',age: 10,sex: '男'
    }
    let 获取信息成功 = true;
    if (获取信息成功) {
    return ctx.body = {
    ok: true,msg: '获取信息成功',data: info
    }
    } else {
    return ctx.body = {
    ok: false,msg: '获取信息失败'
    }
    }
    }));
    / 通过token获取JWT的payload部分 /
    function getJWTPayload(token) {
    // 验证并解析JWT
    return jwt.verify(token.split(' ')[1],secret);
    }

    访问需要认证的接口时,需要在request头附带Authorization:Bearer [token]字段。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

    原文链接地址:https://segmentfault.com/a/1190000014727547

    猜你在找的Node.js相关文章