feat: 完成用户鉴权相关api
This commit is contained in:
1 parent
79cc9c34d6
commit
4c69f57aaa
22 files changed
+903
-68
No files matched your search
@@ -0,0 +1,27 @@
|
||||
// import { defineEventHandler, readBody, createError } from 'h3';
|
||||
import bcrypt from 'bcryptjs';
|
||||
import BetterSqlite3 from 'better-sqlite3';
|
||||
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const body = await readBody(event);
|
||||
const { username, password } = body;
|
||||
|
||||
// 查询用户
|
||||
const userDB = BetterSqlite3('./userData/db/user.db');
|
||||
const user: any = userDB.prepare('SELECT * FROM user WHERE username = ?').get(username);
|
||||
if (!user || password !== user.password) {
|
||||
userDB.close();
|
||||
throw createError({ statusCode: 401, statusMessage: 'Invalid username or password' });
|
||||
}
|
||||
|
||||
// 更新最后登录时间
|
||||
userDB.prepare('UPDATE user SET lastLoginTime = ? WHERE id = ?').run(Date.now(), user.id);
|
||||
|
||||
// 生成 JWT
|
||||
const token = createToken(user.id);
|
||||
|
||||
userDB.close();
|
||||
|
||||
return { token , expiresIn: Date.now() + 168 * 60 * 60 * 1000 };
|
||||
});
|
||||
@@ -0,0 +1,20 @@
|
||||
import { defineEventHandler, readBody, createError } from 'h3';
|
||||
import jwt from 'jsonwebtoken';
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const body = await readBody(event);
|
||||
const { token } = body;
|
||||
|
||||
const jwtSecret = getKey();
|
||||
|
||||
try {
|
||||
// 验证旧的 Token
|
||||
const decoded = jwt.verify(token, jwtSecret) as { userId: number };
|
||||
// 生成新的 Token
|
||||
const newToken = jwt.sign({ userId: decoded.userId }, jwtSecret, { expiresIn: '168h' });
|
||||
|
||||
return { token: newToken, expiresIn: Date.now() + 168 * 60 * 60 * 1000 };
|
||||
} catch (err) {
|
||||
throw createError({ statusCode: 401, statusMessage: 'Token invalid or expired', data: { err, token } });
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,34 @@
|
||||
import bcrypt from 'bcryptjs';
|
||||
import BetterSqlite3 from 'better-sqlite3';
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const body = await readBody(event);
|
||||
const { username, password } = body;
|
||||
|
||||
// 检查用户名是否已存在
|
||||
const userDB = BetterSqlite3('./userData/db/user.db');
|
||||
const existingUser = userDB.prepare('SELECT * FROM user WHERE username = ?').get(username);
|
||||
if (existingUser) {
|
||||
userDB.close();
|
||||
throw createError({ statusCode: 400, statusMessage: 'Username already exists' });
|
||||
}
|
||||
|
||||
// 哈希密码
|
||||
// const salt = getKey().substring(0, 10);
|
||||
// const hashedPassword = bcrypt.hashSync(password, salt);
|
||||
const hashedPassword = password
|
||||
|
||||
// 插入新用户
|
||||
const createTime = Date.now();
|
||||
const lastLoginTime = createTime;
|
||||
const stmt = userDB.prepare('INSERT INTO user (username, password, createTime, lastLoginTime) VALUES (?, ?, ?, ?)');
|
||||
const result = stmt.run(username, hashedPassword, createTime, lastLoginTime);
|
||||
|
||||
// 生成 JWT
|
||||
const userId = result.lastInsertRowid as number;
|
||||
const token = createToken(userId);
|
||||
|
||||
userDB.close();
|
||||
|
||||
return { token, expiresIn: Date.now() + 168 * 60 * 60 * 1000 };
|
||||
});
|
||||
@@ -0,0 +1,31 @@
|
||||
// import { defineEventHandler, readBody, createError } from 'h3';
|
||||
import bcrypt from 'bcryptjs';
|
||||
import BetterSqlite3 from 'better-sqlite3';
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const body = await readBody(event);
|
||||
const { oldPassword, newPassword } = body;
|
||||
const userId = event.context.user.id;
|
||||
|
||||
// 查询用户
|
||||
const userDB = new BetterSqlite3('./userData/db/user.db');
|
||||
const user: any = userDB.prepare('SELECT * FROM user WHERE id = ?').get(userId);
|
||||
if (!user || !bcrypt.compareSync(oldPassword, user.password)) {
|
||||
userDB.close();
|
||||
throw createError({ statusCode: 401, statusMessage: 'Invalid old password' });
|
||||
}
|
||||
|
||||
// 哈希新密码
|
||||
const salt = bcrypt.genSaltSync(10);
|
||||
const hashedPassword = bcrypt.hashSync(newPassword, salt);
|
||||
|
||||
// 更新密码
|
||||
userDB.prepare('UPDATE user SET password = ? WHERE id = ?').run(hashedPassword, userId);
|
||||
|
||||
// 生成新的 JWT
|
||||
const token = createToken(userId);
|
||||
|
||||
userDB.close();
|
||||
|
||||
return { token , expiresIn: Date.now() + 168 * 60 * 60 * 1000 };
|
||||
});
|
||||
Reference in new issue
Block a user