mirror of
https://github.com/movie-web/backend.git
synced 2025-09-13 18:13:26 +00:00
Convert login endpoint to new login method
This commit is contained in:
@@ -1,22 +1,62 @@
|
|||||||
|
import { ChallengeCode } from '@/db/models/ChallengeCode';
|
||||||
import { formatSession } from '@/db/models/Session';
|
import { formatSession } from '@/db/models/Session';
|
||||||
import { User } from '@/db/models/User';
|
import { User } from '@/db/models/User';
|
||||||
|
import { assertChallengeCode } from '@/services/challenge';
|
||||||
import { StatusError } from '@/services/error';
|
import { StatusError } from '@/services/error';
|
||||||
import { handle } from '@/services/handler';
|
import { handle } from '@/services/handler';
|
||||||
import { makeRouter } from '@/services/router';
|
import { makeRouter } from '@/services/router';
|
||||||
import { makeSession, makeSessionToken } from '@/services/session';
|
import { makeSession, makeSessionToken } from '@/services/session';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
|
|
||||||
const loginSchema = z.object({
|
const startSchema = z.object({
|
||||||
id: z.string(),
|
publicKey: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const completeSchema = z.object({
|
||||||
|
publicKey: z.string(),
|
||||||
|
challenge: z.object({
|
||||||
|
code: z.string(),
|
||||||
|
signature: z.string(),
|
||||||
|
}),
|
||||||
device: z.string().max(500).min(1),
|
device: z.string().max(500).min(1),
|
||||||
});
|
});
|
||||||
|
|
||||||
export const loginAuthRouter = makeRouter((app) => {
|
export const loginAuthRouter = makeRouter((app) => {
|
||||||
app.post(
|
app.post(
|
||||||
'/auth/login',
|
'/auth/login/start',
|
||||||
{ schema: { body: loginSchema } },
|
{ schema: { body: startSchema } },
|
||||||
|
handle(async ({ em, body }) => {
|
||||||
|
const user = await em.findOne(User, { publicKey: body.publicKey });
|
||||||
|
|
||||||
|
if (user == null) {
|
||||||
|
throw new StatusError('User cannot be found', 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
const challenge = new ChallengeCode();
|
||||||
|
challenge.authType = 'mnemonic';
|
||||||
|
challenge.flow = 'login';
|
||||||
|
|
||||||
|
await em.persistAndFlush(challenge);
|
||||||
|
|
||||||
|
return {
|
||||||
|
challenge: challenge.code,
|
||||||
|
};
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
app.post(
|
||||||
|
'/auth/login/complete',
|
||||||
|
{ schema: { body: completeSchema } },
|
||||||
handle(async ({ em, body, req }) => {
|
handle(async ({ em, body, req }) => {
|
||||||
const user = await em.findOne(User, { id: body.id });
|
await assertChallengeCode(
|
||||||
|
em,
|
||||||
|
body.challenge.code,
|
||||||
|
body.publicKey,
|
||||||
|
body.challenge.signature,
|
||||||
|
'login',
|
||||||
|
'mnemonic',
|
||||||
|
);
|
||||||
|
|
||||||
|
const user = await em.findOne(User, { publicKey: body.publicKey });
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
throw new StatusError('User cannot be found', 401);
|
throw new StatusError('User cannot be found', 401);
|
||||||
|
Reference in New Issue
Block a user