Nuxt3实战全栈开发简书

登录接口

Preview
  • 登录接口
  • JWT(jsonwebtoken)
  • JWT介绍
  • 安装
  • 登录接口完整代码

登录接口

我们使用jwt实现登录接口。

JWT(jsonwebtoken)

jsonwebtoken官网:https://www.npmjs.com/package/jsonwebtoken

JWT介绍

JWT登录是一种基于令牌的身份验证方式,其优点包括:

  • 无需在服务器端存储会话状态,降低了服务器的负担。

  • 令牌可以在多个服务中共享,提高了系统的可扩展性。

  • 令牌包含了用户信息,可以在客户端进行解析,减少了对服务器端的请求。

  • JWT令牌是经过加密的,可以提高系统的安全性。

  • JWT令牌可以设置过期时间,增强了系统的安全性。

安装

yarn add jsonwebtoken

登录接口和注册接口差不多,也是要进行参数校验

登录接口完整代码

/***
 * 1、获取客户端传过来的手机号和密码
 * 2、数据校验
 * 3、查询数据库判断手机号密码,如果不存在就返回手机号不存在或者密码错误
 * 4、如果已经注册过,并且账号密码正确,就生成token,并返回给客户端,我们的这个token是根据jwt生成的。
 * 5、//server/api/auth/login.post.ts
 */

import Joi from "joi";
import {getDB} from "~/server/utils/db/mysql";
import {responseJson} from "~/server/utils/helper";
import md5 from 'md5'
// @ts-ignore
import jwt from 'jsonwebtoken'

export default defineEventHandler(async (event) => {

    const body = await readBody(event)
    console.log('body',body)
    // 参数校验
    const schema =Joi.object( {
        phone: Joi.string().pattern(/^(?:(?:\+|00)86)?1[3-9]\d{9}$/),
        password: Joi.any().required()
    }).with('phone','password')
    try {
        // 验证
        const test = await schema.validateAsync(body)

    } catch (e) {

        return responseJson(1,'参数错误',{});
    }

    let salt = 'ueidfisgfilegfiff'
    let password = md5(md5(body.password) + salt)
    const con = getDB()
    try {
        // 查询账号密码
        const [rows] = await con.
        execute('SELECT * FROM `users` WHERE `phone` = ? AND `password` = ?', [ body.phone ,password]);
        console.log('rows',rows)
        if (rows.length === 0) {
            return responseJson(1,'账号不存在或密码错误~',{})
        }
        await con.end()
        // 生成token
        const secret = 'shhhhh'
        let token = jwt.sign({data: {uid:rows[0].id} ,exp: Math.floor(Date.now() / 1000) + (60 * 60),}, secret);

        return responseJson(0,'ok',{accessToken:token})
    }catch (e) {
        await con.end()
        return responseJson(1,'服务器错误~',{})
    }

})