Skip to content

Commit a063b81

Browse files
authored
fix: autoLogin not working if old, invalid token is present (#7456)
1 parent 18d9314 commit a063b81

File tree

1 file changed

+67
-37
lines changed
  • packages/payload/src/auth/strategies

1 file changed

+67
-37
lines changed
Lines changed: 67 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import jwt from 'jsonwebtoken'
22

3-
import type { Where } from '../../types/index.js'
3+
import type { Payload, Where } from '../../types/index.js'
44
import type { AuthStrategyFunction, User } from '../index.js'
55

66
import { extractJWT } from '../extractJWT.js'
@@ -10,6 +10,62 @@ type JWTToken = {
1010
id: string
1111
}
1212

13+
async function autoLogin({
14+
isGraphQL,
15+
payload,
16+
}: {
17+
isGraphQL: boolean
18+
payload: Payload
19+
}): Promise<{
20+
user: User | null
21+
}> {
22+
if (
23+
typeof payload?.config?.admin?.autoLogin !== 'object' ||
24+
payload.config.admin?.autoLogin.prefillOnly ||
25+
!payload?.config?.admin?.autoLogin ||
26+
(!payload.config.admin?.autoLogin.email && !payload.config.admin?.autoLogin.username)
27+
) {
28+
return { user: null }
29+
}
30+
31+
const collection = payload.collections[payload.config.admin.user]
32+
33+
const where: Where = {
34+
or: [],
35+
}
36+
if (payload.config.admin?.autoLogin.email) {
37+
where.or.push({
38+
email: {
39+
equals: payload.config.admin?.autoLogin.email,
40+
},
41+
})
42+
} else if (payload.config.admin?.autoLogin.username) {
43+
where.or.push({
44+
username: {
45+
equals: payload.config.admin?.autoLogin.username,
46+
},
47+
})
48+
}
49+
50+
const user = (
51+
await payload.find({
52+
collection: collection.config.slug,
53+
depth: isGraphQL ? 0 : collection.config.auth.depth,
54+
where,
55+
})
56+
).docs[0]
57+
58+
if (!user) {
59+
return { user: null }
60+
}
61+
user.collection = collection.config.slug
62+
user._strategy = 'local-jwt'
63+
64+
return {
65+
user: user as User,
66+
}
67+
}
68+
1369
export const JWTAuthentication: AuthStrategyFunction = async ({
1470
headers,
1571
isGraphQL = false,
@@ -18,43 +74,11 @@ export const JWTAuthentication: AuthStrategyFunction = async ({
1874
try {
1975
const token = extractJWT({ headers, payload })
2076

21-
if (
22-
!token &&
23-
typeof payload?.config?.admin?.autoLogin === 'object' &&
24-
!payload.config.admin?.autoLogin.prefillOnly &&
25-
headers.get('DisableAutologin') !== 'true'
26-
) {
27-
const collection = payload.collections[payload.config.admin.user]
28-
29-
const where: Where = {
30-
or: [],
31-
}
32-
if (payload.config.admin?.autoLogin.email) {
33-
where.or.push({
34-
email: {
35-
equals: payload.config.admin?.autoLogin.email,
36-
},
37-
})
38-
} else if (payload.config.admin?.autoLogin.username) {
39-
where.or.push({
40-
username: {
41-
equals: payload.config.admin?.autoLogin.username,
42-
},
43-
})
44-
}
45-
46-
const user = (
47-
await payload.find({
48-
collection: collection.config.slug,
49-
depth: isGraphQL ? 0 : collection.config.auth.depth,
50-
where,
51-
})
52-
).docs[0]
53-
user.collection = collection.config.slug
54-
user._strategy = 'local-jwt'
55-
return {
56-
user: user as User,
77+
if (!token) {
78+
if (headers.get('DisableAutologin') !== 'true') {
79+
return await autoLogin({ isGraphQL, payload })
5780
}
81+
return { user: null }
5882
}
5983

6084
const decodedPayload = jwt.verify(token, payload.secret) as JWTToken & jwt.JwtPayload
@@ -74,9 +98,15 @@ export const JWTAuthentication: AuthStrategyFunction = async ({
7498
user: user as User,
7599
}
76100
} else {
101+
if (headers.get('DisableAutologin') !== 'true') {
102+
return await autoLogin({ isGraphQL, payload })
103+
}
77104
return { user: null }
78105
}
79106
} catch (error) {
107+
if (headers.get('DisableAutologin') !== 'true') {
108+
return await autoLogin({ isGraphQL, payload })
109+
}
80110
return { user: null }
81111
}
82112
}

0 commit comments

Comments
 (0)