fix: add web-login
This commit is contained in:
@@ -5,4 +5,6 @@ import './me.ts';
|
||||
|
||||
import './update.ts'
|
||||
|
||||
import './init.ts'
|
||||
import './init.ts'
|
||||
|
||||
import './web-login.ts'
|
||||
@@ -2,7 +2,14 @@ import { app } from '@/app.ts';
|
||||
import { Org } from '@/models/org.ts';
|
||||
import { User } from '@/models/user.ts';
|
||||
import { domain } from '@/modules/domain.ts';
|
||||
|
||||
const createCookie = (token: any, ctx: any) => {
|
||||
ctx.res.cookie('token', token.token, {
|
||||
maxAge: token.expireTime,
|
||||
domain,
|
||||
sameSite: 'lax',
|
||||
httpOnly: true,
|
||||
});
|
||||
};
|
||||
app
|
||||
.route({
|
||||
path: 'user',
|
||||
@@ -46,12 +53,7 @@ app
|
||||
ctx.throw(500, 'Password error');
|
||||
}
|
||||
const token = await user.createToken(null, loginType);
|
||||
ctx.res.cookie('token', token.token, {
|
||||
maxAge: token.expireTime,
|
||||
domain,
|
||||
sameSite: 'lax',
|
||||
httpOnly: true,
|
||||
});
|
||||
createCookie(token, ctx);
|
||||
ctx.body = token;
|
||||
})
|
||||
.addTo(app);
|
||||
@@ -135,10 +137,12 @@ app
|
||||
}
|
||||
if (user.type === 'user') {
|
||||
const token = await user.createToken(null, loginType);
|
||||
createCookie(token, ctx);
|
||||
ctx.body = token;
|
||||
return;
|
||||
} else if (user.type === 'org' && tokenUser.uid) {
|
||||
const token = await user.createToken(tokenUser.uid, loginType);
|
||||
createCookie(token, ctx);
|
||||
ctx.body = token;
|
||||
return;
|
||||
}
|
||||
@@ -155,6 +159,7 @@ app
|
||||
}
|
||||
if (type === 'user') {
|
||||
const token = await me.createToken(null, loginType);
|
||||
createCookie(token, ctx);
|
||||
ctx.body = token;
|
||||
return;
|
||||
}
|
||||
@@ -165,6 +170,7 @@ app
|
||||
if (orgUser.type === 'user') {
|
||||
// 想转换的type===org, 但实际上这个用户名是一个用户, 比如org调用switchOrg root
|
||||
const token = await orgUser.createToken(null, loginType);
|
||||
createCookie(token, ctx);
|
||||
ctx.body = token;
|
||||
return;
|
||||
}
|
||||
@@ -175,6 +181,7 @@ app
|
||||
ctx.throw('Permission denied');
|
||||
}
|
||||
const token = await orgUser.createToken(me.id, loginType);
|
||||
createCookie(token, ctx);
|
||||
ctx.body = token;
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
83
src/routes/user/web-login.ts
Normal file
83
src/routes/user/web-login.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
import { app } from '@/app.ts';
|
||||
import { User } from '@/models/user.ts';
|
||||
import { log } from 'console';
|
||||
import MD5 from 'crypto-js/md5.js';
|
||||
|
||||
import jsonwebtoken from 'jsonwebtoken';
|
||||
|
||||
const tokenData: Record<string, string> = {};
|
||||
app
|
||||
.route({
|
||||
path: 'user',
|
||||
key: 'webLogin',
|
||||
middleware: ['auth'],
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
const tokenUser = ctx.state.tokenUser;
|
||||
const { loginToken, sign, randomId } = ctx.query || {};
|
||||
if (!loginToken) {
|
||||
ctx.throw(400, 'loginToken is required');
|
||||
}
|
||||
if (!sign) {
|
||||
ctx.throw(400, 'sign is required');
|
||||
}
|
||||
|
||||
if (!randomId) {
|
||||
ctx.throw(400, 'randomId is required');
|
||||
}
|
||||
const tokenSecret = 'xiao' + randomId;
|
||||
let payload: any = {};
|
||||
try {
|
||||
payload = jsonwebtoken.verify(loginToken, tokenSecret);
|
||||
} catch (e) {
|
||||
ctx.throw(400, 'loginToken error');
|
||||
}
|
||||
const { timestamp } = payload;
|
||||
|
||||
const checkSign = MD5(`${tokenSecret}${timestamp}`).toString();
|
||||
if (sign !== checkSign) {
|
||||
ctx.throw(400, 'sign error');
|
||||
}
|
||||
const user = await User.findByPk(tokenUser.id);
|
||||
console.log('tokenUser', tokenUser)
|
||||
if (!user) {
|
||||
ctx.throw(400, 'user not found');
|
||||
}
|
||||
const token = await user.createToken(null, 'plugin');
|
||||
const data = jsonwebtoken.sign(
|
||||
{
|
||||
userToken: token,
|
||||
user: {
|
||||
username: user.username,
|
||||
id: user.id,
|
||||
},
|
||||
},
|
||||
tokenSecret,
|
||||
{
|
||||
expiresIn: '1h',
|
||||
},
|
||||
);
|
||||
|
||||
// ctx.body = data;
|
||||
tokenData[loginToken] = data;
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
app
|
||||
.route({
|
||||
path: 'user',
|
||||
key: 'checkLoginStatus',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
const { loginToken } = ctx.query;
|
||||
if (!loginToken) {
|
||||
ctx.throw(400, 'loginToken is required');
|
||||
}
|
||||
const data = tokenData[loginToken];
|
||||
if (data) {
|
||||
ctx.body = data;
|
||||
} else {
|
||||
ctx.throw(400, 'Checked Failed');
|
||||
}
|
||||
})
|
||||
.addTo(app);
|
||||
12
src/scripts/user.ts
Normal file
12
src/scripts/user.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { User } from '../models/user.ts';
|
||||
|
||||
const uid = '9b7b521d-082e-4a39-8410-9569c07e3e72';
|
||||
|
||||
User.findByPk(uid).then((user) => {
|
||||
console.log(user);
|
||||
});
|
||||
User.findAll().then((users) => {
|
||||
for (let user of users) {
|
||||
console.log(user.id, user.username);
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user