效果

目前user表只有一个 user name:a1 password 111111
image.png
发起登录请求
image.png
密码或用户名错误
image.png

4-1 安装依赖

  1. npm i koa-jwt jsonwebtoken
  2. # ts
  3. 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

  1. import jwt from 'jsonwebtoken'
  2. import { jwtSecret } from '../config/auth'
  3. export const createToken = (payload: any) => {
  4. return jwt.sign(payload, jwtSecret, { expiresIn: '6h' })
  5. }

创建登录路由

image.png
src/routes/auth.ts

  1. import Router from '@koa/router'
  2. import { loginController, registerController } from '../controller/auth'
  3. const router = new Router({
  4. prefix: '/api/auth'
  5. })
  6. /**
  7. * 用户注册接口
  8. * /auth/register
  9. */
  10. router.post('/register', async ctx => {
  11. ctx.body = await registerController(ctx.request.body)
  12. })
  13. /**
  14. * 用户登录
  15. * /auth/login
  16. */
  17. router.post('/login', async ctx => {
  18. const { username, password } = ctx.request.body
  19. ctx.body = await loginController({ username, password })
  20. })
  21. export default router

创建登录controller

image.png
src/controller/auth.ts

  1. import { RegisterModel } from '../db/models/user'
  2. import { createUser, getUserInfo } from '../services/auth'
  3. import { ErrorResponse, SuccessResponse } from '../utils/Response'
  4. import errorInfo from '../constants/errorInfo'
  5. import { createMd5 } from '../utils/createMD5'
  6. import { createToken } from '../utils/token'
  7. const {
  8. registerUserNameExistInfo,
  9. registerFailInfo,
  10. loginFailInfo
  11. } = errorInfo
  12. /**
  13. * 用户注册controller
  14. * @param params RegisterModel
  15. */
  16. export const registerController = async (params: RegisterModel) => {
  17. const { username, password } = params
  18. // 先看下用户是否已注册
  19. const userInfo = await getUserInfo({ username })
  20. if (userInfo) { // 如果已注册
  21. // 用户已注册
  22. const { code, message } = registerUserNameExistInfo
  23. return new ErrorResponse(code, message)
  24. }
  25. // 用户不存在
  26. try {
  27. await createUser({ // 创建用户
  28. ...params,
  29. password: createMd5(password)
  30. })
  31. return new SuccessResponse({})
  32. } catch (err) { // 注册失败
  33. console.log(err.message, err.stack)
  34. const { code, message } = registerFailInfo
  35. return new ErrorResponse(code, message)
  36. }
  37. }
  38. // 登录controller
  39. interface LoginModel {
  40. username: string;
  41. password: string;
  42. }
  43. export const loginController = async (params: LoginModel) => {
  44. const { username, password } = params
  45. // 根据用户名和密码 获取用户信息
  46. const userInfo = await getUserInfo({ username, password })
  47. if (userInfo) { // 能获取到返回token
  48. const { id, username } = userInfo
  49. const token = createToken({ // 根据用户id和用户名生成token
  50. id,
  51. username
  52. })
  53. return new SuccessResponse({ token })
  54. }
  55. // 获取不到返回 登录失败
  56. const { code, message } = loginFailInfo
  57. return new ErrorResponse(code, message)
  58. }

本节参考源码

https://gitee.com/brolly/vue3-admin-server/commit/b24bd670de474fd0f416c6c4e1807fac161b92dd