跳到主要内容

Koa 登录认证

基于Koa实现JWT登录认证

一、 服务端登录生成 token

安装依赖

yarn add jsonwebtoken -S 

登录接口生成 token 并返回

import JWT from "jsonwebtoken";
import { secret } from "../config/index";

class UserController {
static async login(ctx) {
const { username, password } = ctx.request.body;
if (username !== "bolawen") {
return (ctx.body = {
code: 1,
msg: "暂无用户!",
});
}
if (password !== "bolawen") {
return (ctx.body = {
code: 1,
msg: "密码错误!",
});
}
const token = JWT.sign(
{
data: username,
exp: Math.floor(Date.now() / 1000) + 60 * 60,
},
secret
);
ctx.cookies.set("token", token, {
domain: "localhost",
path: "/",
maxAge: 1000 * 60 * 60 * 1,
expires: new Date(),
httpOnly: false,
overwrite: false,
});
return (ctx.body = {
code: 0,
msg: "登录成功!",
});
}
}

export default UserController;

二、 客户端获取 token ,发送 token

import axios from "axios";
import { mapValues, omit } from "lodash";
import { getCookie } from "../utils/cookie";

const request = axios.create({
withCredentials: true,
baseURL: "http://localhost:4000/",
// baseURL:'https://bolawen.com/server'
});

request.interceptors.request.use(
(config) => {
const token = getCookie("token");
if(token){
config.headers.common['Authorization'] = 'Bearer ' + token;
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
request.interceptors.response.use();
export const requestTransform = (config) => {
return mapValues(config, (value) => {
let method;
let url;
if (typeof value === "string") {
url = value;
} else {
url = value.url;
method = value.method;
config = omit(value, ["url", "method"]);
}
method = method || "get";
if (method === "get") {
return function (params) {
return new Promise((resolve, reject) => {
request[method](url, { params, ...config })
.then((result) => {
resolve(result.data);
})
.catch((error) => {
reject(error);
});
});
};
} else if (method === "post") {
return function (params) {
return new Promise((resolve, reject) => {
request[method](url, params, config)
.then((result) => {
resolve(result.data);
})
.catch((error) => {
reject(error);
});
});
};
}
});
};

export default request;

三、服务端权限接口校验 token

import JWTAuth from "koa-jwt";
import Router from "koa-router";
import Log from "../middleware/log";
import { secret } from "../config/index";
import UserController from "../controller/userByJwt";

const router = new Router({ prefix: "/userByJwt" });

router.post("/login", Log, UserController.login);
router.post("/logout", Log, JWTAuth({ secret }), UserController.logout);
router.get("/find", Log, JWTAuth({ secret }), UserController.find);

module.exports = router;