Skip to content

Commit d05e8d5

Browse files
authored
Merge pull request #135 from manchenkoff/109-enhancement-redirects-stack-up
fix: trim trailing slash on redirects
2 parents 971f9bd + d24014d commit d05e8d5

File tree

6 files changed

+31
-17
lines changed

6 files changed

+31
-17
lines changed

src/runtime/composables/useSanctumAuth.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useSanctumUser } from './useSanctumUser';
44
import { navigateTo, useNuxtApp, useRoute } from '#app';
55
import { useSanctumConfig } from './useSanctumConfig';
66
import { useSanctumAppConfig } from './useSanctumAppConfig';
7+
import { trimTrailingSlash } from '../utils/formatter';
78

89
export interface SanctumAuth<T> {
910
user: Ref<T | null>;
@@ -45,6 +46,7 @@ export const useSanctumAuth = <T>(): SanctumAuth<T> => {
4546
*/
4647
async function login(credentials: Record<string, any>) {
4748
const currentRoute = useRoute();
49+
const currentPath = trimTrailingSlash(currentRoute.path);
4850

4951
if (isAuthenticated.value === true) {
5052
if (options.redirectIfAuthenticated === false) {
@@ -53,13 +55,13 @@ export const useSanctumAuth = <T>(): SanctumAuth<T> => {
5355

5456
if (
5557
options.redirect.onLogin === false ||
56-
options.redirect.onLogin === currentRoute.path
58+
options.redirect.onLogin === currentPath
5759
) {
5860
return;
5961
}
6062

61-
await nuxtApp.runWithContext(() =>
62-
navigateTo(options.redirect.onLogin as string)
63+
await nuxtApp.runWithContext(
64+
async () => await navigateTo(options.redirect.onLogin as string)
6365
);
6466
}
6567

@@ -77,9 +79,9 @@ export const useSanctumAuth = <T>(): SanctumAuth<T> => {
7779
if (options.redirect.keepRequestedRoute) {
7880
const requestedRoute = currentRoute.query.redirect;
7981

80-
if (requestedRoute && requestedRoute !== currentRoute.path) {
81-
await nuxtApp.runWithContext(() =>
82-
navigateTo(requestedRoute as string)
82+
if (requestedRoute && requestedRoute !== currentPath) {
83+
await nuxtApp.runWithContext(
84+
async () => await navigateTo(requestedRoute as string)
8385
);
8486

8587
return;
@@ -93,8 +95,8 @@ export const useSanctumAuth = <T>(): SanctumAuth<T> => {
9395
return;
9496
}
9597

96-
await nuxtApp.runWithContext(() =>
97-
navigateTo(options.redirect.onLogin as string)
98+
await nuxtApp.runWithContext(
99+
async () => await navigateTo(options.redirect.onLogin as string)
98100
);
99101
}
100102

@@ -107,6 +109,7 @@ export const useSanctumAuth = <T>(): SanctumAuth<T> => {
107109
}
108110

109111
const currentRoute = useRoute();
112+
const currentPath = trimTrailingSlash(currentRoute.path);
110113

111114
await client(options.endpoints.logout, { method: 'post' });
112115

@@ -118,13 +121,13 @@ export const useSanctumAuth = <T>(): SanctumAuth<T> => {
118121

119122
if (
120123
options.redirect.onLogout === false ||
121-
currentRoute.path === options.redirect.onLogout
124+
currentPath === options.redirect.onLogout
122125
) {
123126
return;
124127
}
125128

126-
await nuxtApp.runWithContext(() =>
127-
navigateTo(options.redirect.onLogout as string)
129+
await nuxtApp.runWithContext(
130+
async () => await navigateTo(options.redirect.onLogout as string)
128131
);
129132
}
130133

src/runtime/httpFactory.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,11 @@ export function createHttpClient(logger: ConsolaInstance): $Fetch {
107107
options.redirectIfUnauthenticated &&
108108
options.redirect.onAuthOnly
109109
) {
110-
await nuxtApp.runWithContext(() =>
111-
navigateTo(options.redirect.onAuthOnly as string)
110+
await nuxtApp.runWithContext(
111+
async () =>
112+
await navigateTo(
113+
options.redirect.onAuthOnly as string
114+
)
112115
);
113116
}
114117
}

src/runtime/interceptors/cookie/response.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ export default async function handleResponseHeaders(
4848

4949
// follow redirects on client
5050
if (ctx.response.redirected) {
51-
await app.runWithContext(() => navigateTo(ctx.response!.url));
51+
await app.runWithContext(
52+
async () => await navigateTo(ctx.response!.url)
53+
);
5254
}
5355
}

src/runtime/middleware/sanctum.auth.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { defineNuxtRouteMiddleware, navigateTo, createError } from '#app';
22
import type { RouteLocationRaw } from 'vue-router';
33
import { useSanctumConfig } from '../composables/useSanctumConfig';
44
import { useSanctumAuth } from '../composables/useSanctumAuth';
5+
import { trimTrailingSlash } from '../utils/formatter';
56

67
export default defineNuxtRouteMiddleware((to) => {
78
const options = useSanctumConfig();
@@ -20,7 +21,7 @@ export default defineNuxtRouteMiddleware((to) => {
2021
const redirect: RouteLocationRaw = { path: endpoint };
2122

2223
if (options.redirect.keepRequestedRoute) {
23-
redirect.query = { redirect: to.fullPath };
24+
redirect.query = { redirect: trimTrailingSlash(to.fullPath) };
2425
}
2526

2627
return navigateTo(redirect, { replace: true });

src/runtime/middleware/sanctum.global.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { defineNuxtRouteMiddleware, navigateTo } from '#app';
22
import type { RouteLocationRaw } from 'vue-router';
33
import { useSanctumConfig } from '../composables/useSanctumConfig';
44
import { useSanctumAuth } from '../composables/useSanctumAuth';
5+
import { trimTrailingSlash } from '../utils/formatter';
56

67
export default defineNuxtRouteMiddleware((to) => {
78
const options = useSanctumConfig();
@@ -36,7 +37,8 @@ export default defineNuxtRouteMiddleware((to) => {
3637
}
3738

3839
const isPageForGuestsOnly =
39-
to.path === loginPage || to.meta.sanctum?.guestOnly === true;
40+
trimTrailingSlash(to.path) === loginPage ||
41+
to.meta.sanctum?.guestOnly === true;
4042

4143
if (isAuthenticated.value === true) {
4244
if (isPageForGuestsOnly) {
@@ -53,7 +55,7 @@ export default defineNuxtRouteMiddleware((to) => {
5355
const redirect: RouteLocationRaw = { path: loginPage };
5456

5557
if (options.redirect.keepRequestedRoute) {
56-
redirect.query = { redirect: to.fullPath };
58+
redirect.query = { redirect: trimTrailingSlash(to.fullPath) };
5759
}
5860

5961
return navigateTo(redirect, { replace: true });

src/runtime/utils/formatter.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function trimTrailingSlash(path: string): string {
2+
return path.replace(/\/$/, '');
3+
}

0 commit comments

Comments
 (0)