Skip to content

Commit 83486c6

Browse files
committed
feat(auth): improve error handling and response types
1 parent 101e3c9 commit 83486c6

8 files changed

Lines changed: 42 additions & 37 deletions

File tree

src/runtime/api/auth/authorize.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { H3Error, defineEventHandler, getRequestURL } from 'h3'
1+
import { H3Error, defineEventHandler, getRequestURL, sendError } from 'h3'
22
import { useEdgeDbEnv, useEdgeDbPKCE } from '../../server'
33

44
/**
@@ -16,7 +16,7 @@ export default defineEventHandler(async (req) => {
1616
if (!provider) {
1717
const err = new H3Error('Must provide a \'provider\' value in search parameters')
1818
err.statusCode = 400
19-
return err
19+
return sendError(req, err)
2020
}
2121

2222
const pkce = useEdgeDbPKCE()

src/runtime/api/auth/callback.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { H3Error, defineEventHandler, getCookie, getRequestURL, setHeaders } from 'h3'
1+
import { H3Error, defineEventHandler, getCookie, getRequestURL, sendError, setHeaders } from 'h3'
22
import { useEdgeDbEnv } from '../../server'
33

44
/**
@@ -16,14 +16,14 @@ export default defineEventHandler(async (req) => {
1616
const error = requestUrl.searchParams.get('error')
1717
const err = new H3Error(`OAuth callback is missing 'code'. OAuth provider responded with error: ${error}`)
1818
err.statusCode = 400
19-
return err
19+
return sendError(req, err)
2020
}
2121

2222
const verifier = getCookie(req, 'edgedb-pkce-verifier')
2323
if (!verifier) {
2424
const err = new H3Error(`Could not find 'verifier' in the cookie store. Is this the same user agent/browser that started the authorization flow?`)
2525
err.statusCode = 400
26-
return err
26+
return sendError(req, err)
2727
}
2828

2929
const codeExchangeUrl = new URL('token', authBaseUrl)
@@ -36,13 +36,13 @@ export default defineEventHandler(async (req) => {
3636
if (!codeExchangeResponse.ok) {
3737
const err = new H3Error(await codeExchangeResponse.text())
3838
err.statusCode = 400
39-
return err
39+
return sendError(req, err)
4040
}
4141

4242
const codeExchangeResponseData = await codeExchangeResponse.json()
4343

4444
await useNitroApp().hooks.callHook(
45-
'edgedb:auth:callback',
45+
'edgedb:auth:callback' as any,
4646
{
4747
code,
4848
verifier,

src/runtime/api/auth/login.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { H3Error, defineEventHandler, readBody, setCookie } from 'h3'
1+
import { H3Error, defineEventHandler, readBody, sendError, setCookie } from 'h3'
22
import { useEdgeDbEnv, useEdgeDbPKCE } from '../../server'
33

44
export default defineEventHandler(async (req) => {
@@ -10,7 +10,7 @@ export default defineEventHandler(async (req) => {
1010
if (!email || !password || !provider) {
1111
const err = new H3Error(`Request body malformed. Expected JSON body with 'email', 'password', and 'provider' keys, but got: ${Object.entries({ email, password, provider }).filter(([, v]) => !!v)}`)
1212
err.statusCode = 400
13-
return err
13+
return sendError(req, err)
1414
}
1515

1616
const authenticateUrl = new URL('authenticate', authBaseUrl)
@@ -30,7 +30,7 @@ export default defineEventHandler(async (req) => {
3030
if (!authenticateResponse.ok) {
3131
const err = new H3Error(await authenticateResponse.text())
3232
err.statusCode = 400
33-
return err
33+
return sendError(req, err)
3434
}
3535

3636
const authenticateResponseData = await authenticateResponse.json()
@@ -45,7 +45,7 @@ export default defineEventHandler(async (req) => {
4545
if (!tokenResponse.ok) {
4646
const err = new H3Error(await tokenResponse.text())
4747
err.statusCode = 400
48-
return err
48+
return sendError(req, err)
4949
}
5050

5151
const tokenResponseData = await tokenResponse.json()

src/runtime/api/auth/logout.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
import { H3Error, defineEventHandler, getCookie, setCookie } from 'h3'
22

3-
export default defineEventHandler(async (event) => {
4-
const authToken = getCookie(event, 'edgedb-auth-token')
3+
export default defineEventHandler(async (req) => {
4+
const authToken = getCookie(req, 'edgedb-auth-token')
55

66
if (!authToken) {
77
const err = new H3Error('Not logged in')
88
err.statusCode = 401
9-
return err
9+
return sendError(req, err)
1010
}
1111

12-
setCookie(event, 'edgedb-auth-token', '', {
13-
httpOnly: true,
14-
path: '/',
15-
secure: true,
16-
sameSite: true,
17-
expires: new Date(0),
18-
})
12+
setCookie(
13+
req,
14+
'edgedb-auth-token',
15+
'',
16+
{
17+
httpOnly: true,
18+
path: '/',
19+
secure: true,
20+
sameSite: true,
21+
expires: new Date(0),
22+
},
23+
)
1924
})

src/runtime/api/auth/reset-password.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { H3Error, defineEventHandler, getCookie, readBody, setHeaders } from 'h3'
1+
import { H3Error, defineEventHandler, getCookie, readBody, sendError, setHeaders } from 'h3'
22
import { useEdgeDbEnv } from '../../server'
33

44
/**
@@ -13,15 +13,15 @@ export default defineEventHandler(async (req) => {
1313
if (!reset_token || !password) {
1414
const err = new H3Error(`Request body malformed. Expected JSON body with 'reset_token' and 'password' keys.`)
1515
err.statusCode = 400
16-
return err
16+
return sendError(req, err)
1717
}
1818

1919
const provider = 'builtin::local_emailpassword'
2020
const verifier = getCookie(req, 'edgedb-pkce-verifier')
2121
if (!verifier) {
2222
const err = new H3Error(`Could not find 'verifier' in the cookie store. Is this the same user agent/browser that started the authorization flow?`)
2323
err.statusCode = 400
24-
return err
24+
return sendError(req, err)
2525
}
2626

2727
const resetUrl = new URL('reset-password', authBaseUrl)
@@ -40,7 +40,7 @@ export default defineEventHandler(async (req) => {
4040
if (!resetResponse.ok) {
4141
const err = new H3Error(await resetResponse.text())
4242
err.statusCode = 400
43-
return err
43+
return sendError(req, err)
4444
}
4545

4646
const { code } = await resetResponse.json()
@@ -54,7 +54,7 @@ export default defineEventHandler(async (req) => {
5454
if (!tokenResponse.ok) {
5555
const err = new H3Error(await tokenResponse.text())
5656
err.statusCode = 400
57-
return err
57+
return sendError(req, err)
5858
}
5959

6060
const tokenResponseData = await tokenResponse.json()

src/runtime/api/auth/send-password-reset-email.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { H3Error, defineEventHandler, readBody, setHeaders } from 'h3'
1+
import { H3Error, defineEventHandler, readBody, sendError, setHeaders } from 'h3'
22
import { useEdgeDbEnv, useEdgeDbPKCE } from '../../server'
33

44
/**
@@ -16,7 +16,7 @@ export default defineEventHandler(async (req) => {
1616
if (!email) {
1717
const err = new H3Error(`Request body is missing 'email'`)
1818
err.statusCode = 400
19-
return err
19+
return sendError(req, err)
2020
}
2121

2222
const sendResetUrl = new URL('send-reset-email', authBaseUrl)
@@ -36,7 +36,7 @@ export default defineEventHandler(async (req) => {
3636
if (!sendResetResponse.ok) {
3737
const err = new H3Error(await sendResetResponse.text())
3838
err.statusCode = 400
39-
return err
39+
return sendError(req, err)
4040
}
4141

4242
const { email_sent } = await sendResetResponse.json()

src/runtime/api/auth/signup.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { H3Error, defineEventHandler, readBody, setHeaders } from 'h3'
1+
import { H3Error, defineEventHandler, readBody, sendError, setHeaders } from 'h3'
22
import { useEdgeDbEnv, useEdgeDbPKCE } from '../../server'
33

44
/**
@@ -16,7 +16,7 @@ export default defineEventHandler(async (req) => {
1616
if (!email || !password || !provider) {
1717
const err = new H3Error(`Request body malformed. Expected JSON body with 'email', 'password', and 'provider' keys, but got: ${Object.entries({ email, password, provider }).filter(([, v]) => !!v)}`)
1818
err.statusCode = 400
19-
return err
19+
return sendError(req, err)
2020
}
2121

2222
const registerUrl = new URL('register', authBaseUrl)
@@ -37,7 +37,7 @@ export default defineEventHandler(async (req) => {
3737
if (!registerResponse.ok) {
3838
const err = new H3Error(`Error from auth server: ${await registerResponse.text()}`)
3939
err.statusCode = 400
40-
return err
40+
return sendError(req, err)
4141
}
4242

4343
const registerResponseData = await registerResponse.json()

src/runtime/api/auth/verify.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { H3Error, defineEventHandler, getCookie, getRequestURL, setHeaders } from 'h3'
1+
import { H3Error, defineEventHandler, getCookie, getRequestURL, sendError, setHeaders } from 'h3'
22
import { useEdgeDbEnv } from '../../server'
33

44
/**
@@ -14,14 +14,14 @@ export default defineEventHandler(async (req) => {
1414
if (!verification_token) {
1515
const err = new H3Error(`Verify request is missing 'verification_token' search param. The verification email is malformed.`)
1616
err.statusCode = 400
17-
return err
17+
return sendError(req, err)
1818
}
1919

2020
const verifier = getCookie(req, 'edgedb-pkce-verifier')
2121
if (!verifier) {
2222
const err = new H3Error(`Could not find 'verifier' in the cookie store. Is this the same user agent/browser that started the authorization flow?`)
2323
err.statusCode = 400
24-
return err
24+
return sendError(req, err)
2525
}
2626

2727
const verifyUrl = new URL('verify', authBaseUrl)
@@ -40,7 +40,7 @@ export default defineEventHandler(async (req) => {
4040
if (!verifyResponse.ok) {
4141
const err = new H3Error(await verifyResponse.text())
4242
err.statusCode = 400
43-
return err
43+
return sendError(req, err)
4444
}
4545

4646
const { code } = await verifyResponse.json()
@@ -55,7 +55,7 @@ export default defineEventHandler(async (req) => {
5555
if (!tokenResponse.ok) {
5656
const err = new H3Error(await tokenResponse.text())
5757
err.statusCode = 400
58-
return err
58+
return sendError(req, err)
5959
}
6060

6161
const tokenResponseData = await tokenResponse.json()

0 commit comments

Comments
 (0)