@@ -3,7 +3,7 @@ import { db } from '$lib/database'
33import { NodemailerManager as NodeMailerManager } from '$lib/nodemailer_manager'
44import type { PageServerLoad } from '.svelte-kit/types/src/routes/$types'
55import type { User } from '@prisma/client'
6- import { invalid , redirect , type Action , type Actions } from '@sveltejs/kit'
6+ import { invalid , redirect , type Actions } from '@sveltejs/kit'
77
88enum Roles {
99 admin = 'admin' ,
@@ -48,8 +48,8 @@ async function sendMail(user: User, pin_code: string): Promise<void> {
4848async function findUser ( email : string , can_register = true ) : Promise < User | undefined > {
4949 const user = await db . user . findUnique ( { where : { email } } )
5050
51- if ( user ) return user ;
52- if ( ! can_register ) return undefined ;
51+ if ( user ) return user
52+ if ( ! can_register ) return undefined
5353
5454 try {
5555 return await db . user . create ( {
@@ -64,34 +64,52 @@ async function findUser(email: string, can_register = true): Promise<User | unde
6464 }
6565}
6666
67- async function login ( request : Request , can_register = true ) : Promise < Action > {
68- const data = await request . formData ( )
69- const email = data . get ( 'email' ) ?. toString ( ) ?? ''
67+ type GoogleCredential = {
68+ sub : string
69+ name : string
70+ given_name : string
71+ family_name : string
72+ picture : string
73+ email : string
74+ }
7075
71- if ( ! email ) throw redirect ( 302 , '/' )
76+ function decodeJwtResponse ( credential : string ) : GoogleCredential {
77+ const base64Url = credential . split ( '.' ) [ 1 ]
78+ const base64 = base64Url ?. replace ( / - / g, '+' ) . replace ( / _ / g, '/' ) ?? ''
79+ const jsonPayload = decodeURIComponent (
80+ atob ( base64 )
81+ . split ( '' )
82+ . map ( function ( c ) {
83+ return '%' + ( '00' + c . charCodeAt ( 0 ) . toString ( 16 ) ) . slice ( - 2 )
84+ } )
85+ . join ( '' )
86+ )
87+ return JSON . parse ( jsonPayload ) as GoogleCredential
88+ }
7289
73- const user = await findUser ( email , can_register )
90+ export const actions : Actions = {
91+ login : async ( { request } ) => {
92+ const data = await request . formData ( )
93+ const email = data . get ( 'email' ) ?. toString ( ) ?? ''
7494
75- if ( ! user ) return { success : true , email , missing : false , credentials : false }
95+ if ( ! email ) throw redirect ( 302 , '/' )
7696
77- const pin_code = createPinCode ( )
78- console . log ( 'sendmail' )
79- sendMail ( user , pin_code )
97+ const user = await findUser ( email , true )
8098
81- const user_id = user . id
99+ if ( ! user ) return { credentials : true , email , missing : false , success : false }
82100
83- const a = await db . authPin . upsert ( {
84- where : { user_id } ,
85- update : { pin_code } ,
86- create : { user_id, pin_code } ,
87- } )
101+ const pin_code = createPinCode ( )
102+ sendMail ( user , pin_code )
88103
89- return { success : true , email, missing : false , credentials : false }
90- }
104+ const user_id = user . id
91105
92- export const actions : Actions = {
93- login : async ( { request } ) => {
94- return await login ( request )
106+ await db . authPin . upsert ( {
107+ where : { user_id } ,
108+ update : { pin_code } ,
109+ create : { user_id, pin_code } ,
110+ } )
111+
112+ return { success : true , email, missing : false , credentials : false }
95113 } ,
96114 submit : async ( { cookies, request } ) => {
97115 const data = await request . formData ( )
@@ -135,4 +153,38 @@ export const actions: Actions = {
135153
136154 return { success : true , email }
137155 } ,
156+ google : async ( { cookies, request } ) => {
157+ const data = await request . formData ( )
158+ const credential = data . get ( 'credential' ) ?. toString ( ) ?? ''
159+
160+ console . log ( 'Encoded JWT ID token: ' + credential )
161+
162+ if ( ! credential ) return invalid ( 400 , { message : 'Invalid credential' } )
163+
164+ const payload = decodeJwtResponse ( credential )
165+
166+ console . log ( 'ID ' + payload . sub )
167+ console . log ( 'Full Name: ' + payload . name )
168+ console . log ( 'Given Name: ' + payload . given_name )
169+ console . log ( 'Family Name: ' + payload . family_name )
170+ console . log ( 'Image URL: ' + payload . picture )
171+ console . log ( 'Email: ' + payload . email )
172+
173+ const email = payload . email as string
174+ const user = await findUser ( email , true )
175+
176+ if ( ! user ) return { credentials : true , email, missing : false }
177+
178+ const user_id = user . id
179+
180+ const auth_token = await db . authToken . upsert ( {
181+ where : { user_id } ,
182+ update : { token : crypto . randomUUID ( ) } ,
183+ create : { user_id, token : crypto . randomUUID ( ) } ,
184+ } )
185+
186+ new CookiesManager ( cookies ) . setSessionId ( auth_token . token )
187+
188+ redirect ( 302 , '/login' )
189+ } ,
138190}
0 commit comments