sveltekit-auth-example 1.0.15 → 1.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,9 +1,22 @@
1
1
  # Backlog
2
- * [Bug] Address TypeScript issues found during `npm run check` (11 errors) - most related to use of Action type
2
+ * Add username and Avatar icon to menu bar
3
3
  * Consider not setting defaultUser in loginSession as it would simplify +layout.svelte.
4
4
  * Refactor $env/dynamic/private and public
5
5
  * Add password complexity checking on /register and /profile pages (only checks for length currently despite what the pages say)
6
6
 
7
+ # 1.0.19
8
+ * Added SvelteKit's cookies implementation in RequestEvent
9
+ * [Bug] Logout then go to http://localhost/admin gives error on auth.ts:39
10
+
11
+ # 1.0.18
12
+ * Bump dependencies
13
+
14
+ # 1.0.17
15
+ * Bump dependencies
16
+
17
+ # 1.0.16
18
+ * [Bug] Fixed LayoutServerLoad typing
19
+
7
20
  # 1.0.15
8
21
  * [Bug] Replaced use of Action type in +server.ts files (only works for +page.server.ts)
9
22
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sveltekit-auth-example",
3
3
  "description": "SvelteKit Authentication Example",
4
- "version": "1.0.15",
4
+ "version": "1.0.19",
5
5
  "private": false,
6
6
  "author": "Nate Stuyvesant",
7
7
  "license": "https://github.com/nstuyvesant/sveltekit-auth-example/blob/master/LICENSE",
@@ -34,13 +34,12 @@
34
34
  },
35
35
  "engines": {
36
36
  "node": "~18.8.0",
37
- "npm": "^8.18.0"
37
+ "npm": "^8.19.1"
38
38
  },
39
39
  "type": "module",
40
40
  "dependencies": {
41
- "cookie": "^0.5.0",
42
- "dotenv": "^16.0.1",
43
- "google-auth-library": "^8.4.0",
41
+ "dotenv": "^16.0.2",
42
+ "google-auth-library": "^8.5.1",
44
43
  "jsonwebtoken": "^8.5.1",
45
44
  "pg": "^8.8.0"
46
45
  },
@@ -52,21 +51,21 @@
52
51
  "@types/google.accounts": "0.0.2",
53
52
  "@types/jsonwebtoken": "^8.5.9",
54
53
  "@types/pg": "^8.6.5",
55
- "@typescript-eslint/eslint-plugin": "^5.35.0",
56
- "@typescript-eslint/parser": "^5.35.0",
57
- "bootstrap": "^5.2.0",
54
+ "@typescript-eslint/eslint-plugin": "^5.36.1",
55
+ "@typescript-eslint/parser": "^5.36.1",
56
+ "bootstrap": "^5.2.1",
58
57
  "bootstrap-icons": "^1.9.1",
59
58
  "eslint": "^8.23.0",
60
59
  "eslint-config-prettier": "^8.5.0",
61
60
  "eslint-plugin-svelte3": "^4.0.0",
62
61
  "prettier": "^2.7.1",
63
62
  "prettier-plugin-svelte": "^2.7.0",
64
- "sass": "^1.54.5",
65
- "svelte": "^3.49.0",
66
- "svelte-check": "^2.8.1",
63
+ "sass": "^1.54.8",
64
+ "svelte": "^3.50.0",
65
+ "svelte-check": "^2.9.0",
67
66
  "svelte-preprocess": "^4.10.7",
68
67
  "tslib": "^2.4.0",
69
68
  "typescript": "^4.7.4",
70
- "vite": "^3.0.9"
69
+ "vite": "^3.1.0"
71
70
  }
72
71
  }
package/src/hooks.ts CHANGED
@@ -1,9 +1,8 @@
1
- import * as cookie from 'cookie'
2
1
  import type { Handle, RequestEvent } from '@sveltejs/kit'
3
2
  import { query } from './routes/_db'
4
3
 
5
4
  // Attach authorization to each server request (role may have changed)
6
- async function attachUserToRequest(sessionId: string, event: RequestEvent) {
5
+ async function attachUserToRequestEvent(sessionId: string, event: RequestEvent) {
7
6
  const sql = `
8
7
  SELECT * FROM get_session($1);`
9
8
  const { rows } = await query(sql, [sessionId])
@@ -12,24 +11,20 @@ async function attachUserToRequest(sessionId: string, event: RequestEvent) {
12
11
  }
13
12
  }
14
13
 
15
- function deleteCookieIfNoUser(event: RequestEvent, response: Response) {
16
- if (!event.locals.user) {
17
- response.headers.set('Set-Cookie', `session=; Path=/; HttpOnly; SameSite=Lax; Expires=${new Date().toUTCString()}`)
18
- }
19
- }
20
-
21
14
  // Invoked for each endpoint called and initially for SSR router
22
15
  export const handle: Handle = async ({ event, resolve }) => {
16
+ const { cookies } = event
17
+ const sessionId = cookies.get('session')
23
18
 
24
19
  // before endpoint or page is called
25
- const cookies = cookie.parse(event.request.headers.get('Cookie') || '')
26
- if (cookies.session) {
27
- await attachUserToRequest(cookies.session, event)
20
+ if (sessionId) {
21
+ await attachUserToRequestEvent(sessionId, event)
28
22
  }
29
23
 
30
24
  const response = await resolve(event)
31
25
 
32
26
  // after endpoint or page is called
33
- deleteCookieIfNoUser(event, response)
27
+ if (!event.locals.user) cookies.delete('session')
28
+
34
29
  return response
35
30
  }
@@ -1,6 +1,7 @@
1
1
  import type { LayoutServerLoad } from './$types'
2
2
 
3
- export function load({ locals }): LayoutServerLoad {
3
+ export const load: LayoutServerLoad = (event) => {
4
+ const locals = event.locals
4
5
  const { user }: { user: User } = locals // locals.user set by hooks.ts/handle(), undefined if not logged in
5
6
  return {
6
7
  user
@@ -1,13 +1,13 @@
1
1
  <script lang="ts">
2
2
  import { onMount } from 'svelte'
3
- import type { LayoutData } from './$types'
3
+ import type { LayoutServerData } from './$types'
4
4
  import { goto } from '$app/navigation'
5
5
  import { page } from '$app/stores'
6
6
  import { loginSession, toast } from '../stores'
7
7
  import useAuth from '$lib/auth'
8
8
  import 'bootstrap/scss/bootstrap.scss' // preferred way to load Bootstrap SCSS for hot module reloading
9
9
 
10
- export let data: LayoutData
10
+ export let data: LayoutServerData
11
11
 
12
12
  // If returning from different website, runs once (as it's an SPA) to restore user session if session cookie is still valid
13
13
  const { user } = data
@@ -4,8 +4,9 @@ import type { PageServerLoad } from './$types'
4
4
  export const load: PageServerLoad = async ({locals})=> {
5
5
  const { user } = locals
6
6
  const authorized = ['admin']
7
- if (user && !authorized.includes(user.role)) {
8
- throw redirect(302, '/login?referrer=/admin');
7
+ console.log('admin/+page.server.ts', user)
8
+ if (!user || !authorized.includes(user.role)) {
9
+ throw redirect(302, '/login?referrer=/admin')
9
10
  }
10
11
 
11
12
  return {
@@ -1,4 +1,5 @@
1
- import { error, json, type RequestHandler } from '@sveltejs/kit'
1
+ import { error, json} from '@sveltejs/kit'
2
+ import type { RequestHandler } from './$types'
2
3
  import { query } from '../../../_db'
3
4
 
4
5
  export const PUT: RequestHandler = async event => {
@@ -1,4 +1,5 @@
1
- import { error, json, type RequestHandler } from '@sveltejs/kit'
1
+ import { error, json } from '@sveltejs/kit'
2
+ import type { RequestHandler } from './$types'
2
3
  import { query } from '../../_db'
3
4
 
4
5
  export const POST: RequestHandler = async (event) => {
@@ -15,11 +16,12 @@ export const POST: RequestHandler = async (event) => {
15
16
  sql = `CALL delete_session($1);`
16
17
  result = await query(sql, [event.locals.user.id])
17
18
  }
18
- return new Response(JSON.stringify({ message: 'Logout successful.' }), {
19
+ return json({ message: 'Logout successful.' }, {
19
20
  headers: {
20
21
  'Set-Cookie': `session=; Path=/; SameSite=Lax; HttpOnly; Expires=${new Date().toUTCString()}`
21
22
  }
22
23
  })
24
+
23
25
  case 'login':
24
26
  sql = `SELECT authenticate($1) AS "authenticationResult";`
25
27
  break
@@ -1,4 +1,4 @@
1
- import type { RequestHandler } from '@sveltejs/kit'
1
+ import type { RequestHandler } from './$types'
2
2
  import type { Secret } from 'jsonwebtoken'
3
3
  import jwt from 'jsonwebtoken'
4
4
  import dotenv from 'dotenv'
@@ -1,4 +1,5 @@
1
- import { error, type RequestHandler } from '@sveltejs/kit'
1
+ import { error, json } from '@sveltejs/kit'
2
+ import type { RequestHandler } from './$types'
2
3
  import { OAuth2Client } from 'google-auth-library'
3
4
  import { query } from '../../_db';
4
5
  import { config } from '$lib/config'
@@ -50,15 +51,14 @@ export const POST: RequestHandler = async event => {
50
51
  // Prevent hooks.ts's handler() from deleting cookie thinking no one has authenticated
51
52
  event.locals.user = userSession.user
52
53
 
53
- return new Response(JSON.stringify({
54
+ return json({
54
55
  message: 'Successful Google Sign-In.',
55
56
  user: userSession.user
56
- }), {
57
+ }, {
57
58
  headers: {
58
59
  'Set-Cookie': `session=${userSession.id}; Path=/; SameSite=Lax; HttpOnly;`}
59
- }
60
- )
61
-
60
+ })
61
+
62
62
  } catch (err) {
63
63
  let message = ''
64
64
  if (err instanceof Error) message = err.message
@@ -1,6 +1,6 @@
1
1
  import { json as json$1 } from '@sveltejs/kit';
2
2
  import dotenv from 'dotenv'
3
- import type { RequestHandler } from '@sveltejs/kit'
3
+ import type { RequestHandler } from './$types'
4
4
  import type { JwtPayload } from 'jsonwebtoken'
5
5
  import jwt from 'jsonwebtoken'
6
6
  import { query } from '../../_db'
@@ -5,7 +5,7 @@ export const load: PageServerLoad = async ({ locals }) => {
5
5
  const { user } = locals // populated by /src/hooks.ts
6
6
 
7
7
  const authorized = ['admin', 'teacher', 'student'] // must be logged-in
8
- if (user && !authorized.includes(user.role)) {
8
+ if (!user || !authorized.includes(user.role)) {
9
9
  throw redirect(302, '/login?referrer=/profile')
10
10
  }
11
11
 
@@ -1,10 +1,10 @@
1
- import { redirect } from '@sveltejs/kit';
1
+ import { redirect } from '@sveltejs/kit'
2
2
  import type { PageServerLoad } from './$types'
3
3
 
4
4
  export const load: PageServerLoad = ({ locals }) => {
5
5
  const { user } = locals
6
6
  if (user) { // Redirect to home if user is logged in already
7
- throw redirect(302, '/');
7
+ throw redirect(302, '/')
8
8
  }
9
9
  return {}
10
10
  }
@@ -2,8 +2,9 @@ import { redirect } from '@sveltejs/kit'
2
2
  import type { PageServerLoad } from './$types'
3
3
 
4
4
  export const load: PageServerLoad = async ({locals}) => {
5
+ const { user } = locals
5
6
  const authorized = ['admin', 'teacher']
6
- if (!locals.user || !authorized.includes(locals.user.role)) {
7
+ if (!user || !authorized.includes(user.role)) {
7
8
  throw redirect(302, '/login?referrer=/teachers')
8
9
  }
9
10