效果
目前user表只有一个 user name:a1 password 111111
发起登录请求
密码或用户名错误
4-1 安装依赖
npm i koa-jwt jsonwebtoken
# ts
npm 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.body
ctx.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 } = registerUserNameExistInfo
return 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 } = registerFailInfo
return new ErrorResponse(code, message)
}
}
// 登录controller
interface LoginModel {
username: string;
password: string;
}
export const loginController = async (params: LoginModel) => {
const { username, password } = params
// 根据用户名和密码 获取用户信息
const userInfo = await getUserInfo({ username, password })
if (userInfo) { // 能获取到返回token
const { id, username } = userInfo
const token = createToken({ // 根据用户id和用户名生成token
id,
username
})
return new SuccessResponse({ token })
}
// 获取不到返回 登录失败
const { code, message } = loginFailInfo
return new ErrorResponse(code, message)
}
本节参考源码
https://gitee.com/brolly/vue3-admin-server/commit/b24bd670de474fd0f416c6c4e1807fac161b92dd