Skip to content

Commit d8c106c

Browse files
authored
fix(templates): broken preview if alternative auth strategy was used, invalid error handling (#9785)
Previously, live preview did not work with oauth, as no token is present
1 parent e468292 commit d8c106c

File tree

6 files changed

+29
-37
lines changed

6 files changed

+29
-37
lines changed

examples/draft-preview/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
"dotenv": "^8.2.0",
2323
"escape-html": "^1.0.3",
2424
"graphql": "^16.9.0",
25-
"jsonwebtoken": "9.0.2",
2625
"next": "^15.0.0",
2726
"payload": "latest",
2827
"payload-admin-bar": "^1.0.6",

examples/draft-preview/src/app/(app)/next/preview/route.ts

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import type { CollectionSlug } from 'payload'
1+
import type { CollectionSlug, PayloadRequest } from 'payload'
22

3-
import jwt from 'jsonwebtoken'
43
import { draftMode } from 'next/headers'
54
import { redirect } from 'next/navigation'
65
import { getPayload } from 'payload'
@@ -42,23 +41,21 @@ export async function GET(
4241
return new Response('No path provided', { status: 404 })
4342
}
4443

45-
if (!token) {
46-
new Response('You are not allowed to preview this page', { status: 403 })
47-
}
48-
4944
if (!path.startsWith('/')) {
50-
new Response('This endpoint can only be used for internal previews', { status: 500 })
45+
return new Response('This endpoint can only be used for internal previews', { status: 500 })
5146
}
5247

5348
let user
5449

5550
try {
56-
user = jwt.verify(token, payload.secret)
57-
} catch (error) {
58-
payload.logger.error({
59-
err: error,
60-
msg: 'Error verifying token for live preview',
51+
user = await payload.auth({
52+
req: req as unknown as PayloadRequest,
53+
headers: req.headers,
6154
})
55+
} catch (error) {
56+
console.log({ token, payloadSecret: payload.secret })
57+
payload.logger.error({ err: error }, 'Error verifying token for live preview')
58+
return new Response('You are not allowed to preview this page', { status: 403 })
6259
}
6360

6461
const draft = await draftMode()

templates/website/package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
"cross-env": "^7.0.3",
4040
"geist": "^1.3.0",
4141
"graphql": "^16.8.2",
42-
"jsonwebtoken": "9.0.2",
4342
"lucide-react": "^0.378.0",
4443
"next": "^15.1.0",
4544
"next-sitemap": "^4.2.3",
@@ -57,7 +56,6 @@
5756
"@eslint/eslintrc": "^3.2.0",
5857
"@tailwindcss/typography": "^0.5.13",
5958
"@types/escape-html": "^1.0.2",
60-
"@types/jsonwebtoken": "^9.0.6",
6159
"@types/node": "22.5.4",
6260
"@types/react": "19.0.1",
6361
"@types/react-dom": "19.0.1",

templates/website/src/app/(frontend)/next/preview/route.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import jwt from 'jsonwebtoken'
21
import { draftMode } from 'next/headers'
32
import { redirect } from 'next/navigation'
4-
import { getPayload } from 'payload'
3+
import { getPayload, type PayloadRequest } from 'payload'
54
import configPromise from '@payload-config'
65
import { CollectionSlug } from 'payload'
76

@@ -40,20 +39,21 @@ export async function GET(
4039
return new Response('No path provided', { status: 404 })
4140
}
4241

43-
if (!token) {
44-
new Response('You are not allowed to preview this page', { status: 403 })
45-
}
46-
4742
if (!path.startsWith('/')) {
48-
new Response('This endpoint can only be used for internal previews', { status: 500 })
43+
return new Response('This endpoint can only be used for internal previews', { status: 500 })
4944
}
5045

5146
let user
5247

5348
try {
54-
user = jwt.verify(token, payload.secret)
49+
user = await payload.auth({
50+
req: req as unknown as PayloadRequest,
51+
headers: req.headers,
52+
})
5553
} catch (error) {
56-
payload.logger.error('Error verifying token for live preview:', error)
54+
console.log({ token, payloadSecret: payload.secret })
55+
payload.logger.error({ err: error }, 'Error verifying token for live preview')
56+
return new Response('You are not allowed to preview this page', { status: 403 })
5757
}
5858

5959
const draft = await draftMode()
@@ -85,7 +85,7 @@ export async function GET(
8585
return new Response('Document not found', { status: 404 })
8686
}
8787
} catch (error) {
88-
payload.logger.error('Error verifying token for live preview:', error)
88+
payload.logger.error({ err: error }, 'Error verifying token for live preview')
8989
}
9090

9191
draft.enable()

templates/with-vercel-website/package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
"cross-env": "^7.0.3",
4242
"geist": "^1.3.0",
4343
"graphql": "^16.8.2",
44-
"jsonwebtoken": "9.0.2",
4544
"lucide-react": "^0.378.0",
4645
"next": "^15.1.0",
4746
"next-sitemap": "^4.2.3",
@@ -59,7 +58,6 @@
5958
"@eslint/eslintrc": "^3.2.0",
6059
"@tailwindcss/typography": "^0.5.13",
6160
"@types/escape-html": "^1.0.2",
62-
"@types/jsonwebtoken": "^9.0.6",
6361
"@types/node": "22.5.4",
6462
"@types/react": "19.0.1",
6563
"@types/react-dom": "19.0.1",

templates/with-vercel-website/src/app/(frontend)/next/preview/route.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import jwt from 'jsonwebtoken'
21
import { draftMode } from 'next/headers'
32
import { redirect } from 'next/navigation'
43
import { getPayload } from 'payload'
54
import configPromise from '@payload-config'
6-
import { CollectionSlug } from 'payload'
5+
import type { CollectionSlug, PayloadRequest } from 'payload'
76

87
const payloadToken = 'payload-token'
98

@@ -40,20 +39,21 @@ export async function GET(
4039
return new Response('No path provided', { status: 404 })
4140
}
4241

43-
if (!token) {
44-
new Response('You are not allowed to preview this page', { status: 403 })
45-
}
46-
4742
if (!path.startsWith('/')) {
48-
new Response('This endpoint can only be used for internal previews', { status: 500 })
43+
return new Response('This endpoint can only be used for internal previews', { status: 500 })
4944
}
5045

5146
let user
5247

5348
try {
54-
user = jwt.verify(token, payload.secret)
49+
user = await payload.auth({
50+
req: req as unknown as PayloadRequest,
51+
headers: req.headers,
52+
})
5553
} catch (error) {
56-
payload.logger.error('Error verifying token for live preview:', error)
54+
console.log({ token, payloadSecret: payload.secret })
55+
payload.logger.error({ err: error }, 'Error verifying token for live preview')
56+
return new Response('You are not allowed to preview this page', { status: 403 })
5757
}
5858

5959
const draft = await draftMode()
@@ -85,7 +85,7 @@ export async function GET(
8585
return new Response('Document not found', { status: 404 })
8686
}
8787
} catch (error) {
88-
payload.logger.error('Error verifying token for live preview:', error)
88+
payload.logger.error({ err: error }, 'Error verifying token for live preview')
8989
}
9090

9191
draft.enable()

0 commit comments

Comments
 (0)