登录接口
我们使用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,'服务器错误~',{})
}
})