Skip to content

Commit b1e4aba

Browse files
Thomas-PhilippotThomaszoey-kaiserphoenix-ru
authored
enh(#935): allow external login page (#936)
* allow external link as login page * allow external login page * fix typecheck * chore: adjust the external handling --------- Co-authored-by: Thomas <thomas.philippot@labo-mylab.fr> Co-authored-by: Zoey <zoeykaiser8@gmail.com> Co-authored-by: Marsel Shaikhin <phoenix.apps@yahoo.com>
1 parent 37b0c65 commit b1e4aba

File tree

4 files changed

+25
-8
lines changed

4 files changed

+25
-8
lines changed

src/runtime/middleware/sidebase-auth.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { determineCallbackUrl } from '../utils/url'
1+
import { determineCallbackUrl, isExternalUrl } from '../utils/url'
22
import { isProduction } from '../helpers'
3+
import { ERROR_PREFIX } from '../utils/logger'
34
import { defineNuxtRouteMiddleware, navigateTo, useAuth, useRuntimeConfig } from '#imports'
45

56
type MiddlewareMeta = boolean | {
@@ -98,23 +99,30 @@ export default defineNuxtRouteMiddleware((to) => {
9899
return navigateTo(options.navigateUnauthenticatedTo)
99100
}
100101

102+
const loginPage = authConfig.provider.pages.login
103+
if (typeof loginPage !== 'string') {
104+
console.warn(`${ERROR_PREFIX} provider.pages.login is misconfigured`)
105+
return
106+
}
107+
101108
// Default callback URL was provided
109+
const external = isExternalUrl(loginPage)
102110
if (typeof globalAppMiddleware === 'object' && globalAppMiddleware.addDefaultCallbackUrl) {
103111
let redirectUrl: string = to.fullPath
104112
if (typeof globalAppMiddleware.addDefaultCallbackUrl === 'string') {
105113
redirectUrl = globalAppMiddleware.addDefaultCallbackUrl
106114
}
107115

108116
return navigateTo({
109-
path: authConfig.provider.pages.login,
117+
path: loginPage,
110118
query: {
111119
redirect: redirectUrl
112120
}
113-
})
121+
}, { external })
114122
}
115123

116124
// Fall back to login page
117-
return navigateTo(authConfig.provider.pages.login)
125+
return navigateTo(loginPage, { external })
118126
})
119127

120128
interface MiddlewareOptionsNormalized {
@@ -146,7 +154,7 @@ function normalizeUserOptions(userOptions: MiddlewareMeta | undefined): Middlewa
146154
if (userOptions.unauthenticatedOnly === undefined) {
147155
if (!isProduction) {
148156
console.warn(
149-
'[@sidebase/nuxt-auth] `unauthenticatedOnly` was not provided to `definePageMeta` - defaulting to Guest Mode enabled. '
157+
`${ERROR_PREFIX} \`unauthenticatedOnly\` was not provided to \`definePageMeta\` - defaulting to Guest Mode enabled. `
150158
+ 'Read more at https://auth.sidebase.io/guide/application-side/protecting-pages#middleware-options'
151159
)
152160
}

src/runtime/utils/fetch.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { resolveApiUrlPath } from './url'
2+
import { ERROR_PREFIX } from './logger'
23
import { callWithNuxt, useRuntimeConfig } from '#app'
34
import type { useNuxtApp } from '#imports'
45

5-
const ERROR_PREFIX = '[@sidebase/nuxt-auth]'
6-
76
export async function _fetch<T>(nuxt: ReturnType<typeof useNuxtApp>, path: string, fetchOptions?: Parameters<typeof $fetch>[1]): Promise<T> {
87
const runtimeConfig = await callWithNuxt(nuxt, useRuntimeConfig)
98
const joinedPath = resolveApiUrlPath(path, runtimeConfig)

src/runtime/utils/logger.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const ERROR_PREFIX = '[@sidebase/nuxt-auth]'

src/runtime/utils/url.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export function resolveApiUrlPath(
1717
runtimeConfig: RuntimeConfig
1818
): string {
1919
// Fully-specified endpoint path - do not join with `baseURL`
20-
if (endpointPath.startsWith('http://') || endpointPath.startsWith('https://')) {
20+
if (isExternalUrl(endpointPath)) {
2121
return endpointPath
2222
}
2323

@@ -95,3 +95,12 @@ export function determineCallbackUrl<T extends string | Promise<string>>(
9595
return getOriginalTargetPath()
9696
}
9797
}
98+
99+
/**
100+
* Naively checks if a URL is external or not by comparing against its protocol.
101+
*
102+
* URL being valid is not a concern for this function as it is used with developer-controlled inputs.
103+
*/
104+
export function isExternalUrl(url: string): boolean {
105+
return url.startsWith('http://') || url.startsWith('https://')
106+
}

0 commit comments

Comments
 (0)