@@ -21,9 +21,11 @@ type ConfigError =
21
21
22
22
let twitterWarned = false
23
23
24
- function isValidHttpUrl ( url : string ) {
24
+ function isValidHttpUrl ( url : string , baseUrl : string ) {
25
25
try {
26
- return / ^ h t t p s ? : / . test ( new URL ( url ) . protocol )
26
+ return / ^ h t t p s ? : / . test (
27
+ new URL ( url , url . startsWith ( "/" ) ? baseUrl : undefined ) . protocol
28
+ )
27
29
} catch {
28
30
return false
29
31
}
@@ -57,23 +59,24 @@ export function assertConfig(
57
59
58
60
const callbackUrlParam = req . query ?. callbackUrl as string | undefined
59
61
60
- if ( callbackUrlParam && ! isValidHttpUrl ( callbackUrlParam ) ) {
62
+ const url = parseUrl ( req . host )
63
+
64
+ if ( callbackUrlParam && ! isValidHttpUrl ( callbackUrlParam , url . base ) ) {
61
65
return new InvalidCallbackUrl (
62
66
`Invalid callback URL. Received: ${ callbackUrlParam } `
63
67
)
64
68
}
65
69
70
+ // This is below the callbackUrlParam check because it would obscure the error
66
71
if ( ! req . host ) return "NEXTAUTH_URL"
67
72
68
- const url = parseUrl ( req . host )
69
-
70
73
const { callbackUrl : defaultCallbackUrl } = defaultCookies (
71
74
options . useSecureCookies ?? url . base . startsWith ( "https://" )
72
75
)
73
76
const callbackUrlCookie =
74
77
req . cookies ?. [ options . cookies ?. callbackUrl ?. name ?? defaultCallbackUrl . name ]
75
78
76
- if ( callbackUrlCookie && ! isValidHttpUrl ( callbackUrlCookie ) ) {
79
+ if ( callbackUrlCookie && ! isValidHttpUrl ( callbackUrlCookie , url . base ) ) {
77
80
return new InvalidCallbackUrl (
78
81
`Invalid callback URL. Received: ${ callbackUrlCookie } `
79
82
)
0 commit comments