效果
目前user表只有一个 user name:a1 password 111111
发起登录请求
密码或用户名错误
4-1 安装依赖
npm i koa-jwt jsonwebtoken# tsnpm i @types/koa-jwt @types/jsonwebtoken -D
koa-jwt 用户token认证 请求headers是否携带token,未携带直接返回未认证 koa-jwt文档
jsonwebtoken token生成与token验证 jsonwebtoken文档
4-2 开发登录接口
封装token生成方法
src/utils/token.ts
import jwt from 'jsonwebtoken'import { jwtSecret } from '../config/auth'export const createToken = (payload: any) => {return jwt.sign(payload, jwtSecret, { expiresIn: '6h' })}
创建登录路由

src/routes/auth.ts
import Router from '@koa/router'import { loginController, registerController } from '../controller/auth'const router = new Router({prefix: '/api/auth'})/*** 用户注册接口* /auth/register*/router.post('/register', async ctx => {ctx.body = await registerController(ctx.request.body)})/*** 用户登录* /auth/login*/router.post('/login', async ctx => {const { username, password } = ctx.request.bodyctx.body = await loginController({ username, password })})export default router
创建登录controller

src/controller/auth.ts
import { RegisterModel } from '../db/models/user'import { createUser, getUserInfo } from '../services/auth'import { ErrorResponse, SuccessResponse } from '../utils/Response'import errorInfo from '../constants/errorInfo'import { createMd5 } from '../utils/createMD5'import { createToken } from '../utils/token'const {registerUserNameExistInfo,registerFailInfo,loginFailInfo} = errorInfo/*** 用户注册controller* @param params RegisterModel*/export const registerController = async (params: RegisterModel) => {const { username, password } = params// 先看下用户是否已注册const userInfo = await getUserInfo({ username })if (userInfo) { // 如果已注册// 用户已注册const { code, message } = registerUserNameExistInforeturn new ErrorResponse(code, message)}// 用户不存在try {await createUser({ // 创建用户...params,password: createMd5(password)})return new SuccessResponse({})} catch (err) { // 注册失败console.log(err.message, err.stack)const { code, message } = registerFailInforeturn new ErrorResponse(code, message)}}// 登录controllerinterface LoginModel {username: string;password: string;}export const loginController = async (params: LoginModel) => {const { username, password } = params// 根据用户名和密码 获取用户信息const userInfo = await getUserInfo({ username, password })if (userInfo) { // 能获取到返回tokenconst { id, username } = userInfoconst token = createToken({ // 根据用户id和用户名生成tokenid,username})return new SuccessResponse({ token })}// 获取不到返回 登录失败const { code, message } = loginFailInforeturn new ErrorResponse(code, message)}
本节参考源码
https://gitee.com/brolly/vue3-admin-server/commit/b24bd670de474fd0f416c6c4e1807fac161b92dd
