Skip to content

Commit b626f08

Browse files
authored
[Bugfix]: Patch Auth Checks in Routing (#7)
1 parent 2ada2c4 commit b626f08

File tree

8 files changed

+208
-252
lines changed

8 files changed

+208
-252
lines changed

{{cookiecutter.project_slug}}/frontend/app/lib/slices/authSlice.ts

Lines changed: 145 additions & 177 deletions
Large diffs are not rendered by default.

{{cookiecutter.project_slug}}/frontend/app/login/page.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ export default function Page() {
117117
const {
118118
register,
119119
handleSubmit,
120+
unregister,
120121
formState: { errors },
121122
} = useForm()
122123

@@ -126,14 +127,20 @@ export default function Page() {
126127
)
127128
}
128129

130+
const toggleOauth = (e: any) => {
131+
// If previous state enabled oauth, unregister password valdiation
132+
if (oauth) unregister('password')
133+
setOauth(e)
134+
}
135+
129136
useEffect(() => {
130137
if (searchParams && searchParams.get("oauth")) setOauth(true)
131138
}, [searchParams])
132139

133140
useEffect(() => {
134141
if (isLoggedIn) return redirectTo(redirectAfterLogin)
135-
if (accessToken && tokenIsTOTP(accessToken)) return redirectTo(redirectTOTP)
136-
if (accessToken && tokenParser(accessToken).hasOwnProperty("fingerprint"))
142+
if (accessToken && tokenIsTOTP(accessToken) && !oauth) return redirectTo(redirectTOTP)
143+
if (accessToken && tokenParser(accessToken).hasOwnProperty("fingerprint") && !oauth)
137144
return redirectTo(redirectAfterMagic)
138145
}, [isLoggedIn, accessToken]) // eslint-disable-line react-hooks/exhaustive-deps
139146

@@ -197,7 +204,7 @@ export default function Page() {
197204
</p>
198205
<Switch
199206
checked={oauth}
200-
onChange={setOauth}
207+
onChange={toggleOauth}
201208
className="group relative inline-flex h-5 w-10 flex-shrink-0 cursor-pointer items-center justify-center rounded-full focus:outline-none focus:ring-2 focus:ring-rose-600 focus:ring-offset-2"
202209
>
203210
<span className="sr-only">Use setting</span>

{{cookiecutter.project_slug}}/frontend/app/magic/page.tsx

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,37 @@ import { LinkIcon, EnvelopeIcon } from "@heroicons/react/24/outline"
44
import { tokenParser } from "../lib/utilities"
55
import { token } from "../lib/slices/tokensSlice"
66
import { useEffect } from "react"
7-
import { useAppSelector } from "../lib/hooks"
7+
import { useAppDispatch, useAppSelector } from "../lib/hooks"
88
import Link from "next/link"
99
import { RootState } from "../lib/store"
1010
import { useRouter } from "next/navigation"
11+
import { loggedIn, logout } from "../lib/slices/authSlice"
1112

1213
const redirectRoute = "/login"
1314

1415
export default function Magic() {
1516
const router = useRouter()
1617
const accessToken = useAppSelector((state: RootState) => token(state))
18+
const isLoggedIn = useAppSelector((state: RootState) => loggedIn(state))
19+
const dispatch = useAppDispatch()
1720

1821
useEffect(() => {
19-
if (
20-
accessToken &&
21-
!tokenParser(accessToken).hasOwnProperty("fingerprint")
22-
) {
23-
router.push(redirectRoute)
22+
async function checkCredentials(): Promise<void> {
23+
if (isLoggedIn) {
24+
router.push("/")
25+
}
26+
if (
27+
!(accessToken && tokenParser(accessToken).hasOwnProperty("fingerprint"))
28+
) {
29+
router.push(redirectRoute)
30+
}
2431
}
25-
}) // eslint-disable-line react-hooks/exhaustive-deps
32+
checkCredentials()
33+
}, [])
34+
35+
const removeFingerprint = async () => {
36+
await dispatch(logout())
37+
}
2638

2739
return (
2840
<main className="flex min-h-full">
@@ -46,7 +58,7 @@ export default function Magic() {
4658
</p>
4759
</div>
4860

49-
<Link href="/login?oauth=true" className="mt-8 flex">
61+
<Link href="/login?oauth=true" className="mt-8 flex" onClick={removeFingerprint}>
5062
<LinkIcon
5163
className="text-rose-500 h-4 w-4 mr-1"
5264
aria-hidden="true"

{{cookiecutter.project_slug}}/frontend/app/moderation/page.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,20 @@ import {
66
UserPlusIcon,
77
} from "@heroicons/react/24/outline"
88
import { useRouter } from "next/navigation"
9-
import { useState } from "react"
9+
import { useState, useEffect } from "react"
1010
import UserTable from "../components/moderation/UserTable"
1111
import CreateUser from "../components/moderation/CreateUser"
12+
import { useAppSelector } from "../lib/hooks"
13+
import { isAdmin } from "../lib/slices/authSlice"
1214

1315
const navigation = [
1416
{ name: "Users", id: "USERS", icon: UsersIcon },
1517
{ name: "Create", id: "CREATE", icon: UserPlusIcon },
1618
]
17-
const title = "User moderation"
18-
const description = "Create, delete and update individual user settings."
1919

2020
export default function Moderation() {
2121
const [selected, changeSelection] = useState("USERS")
22+
const isValidAdmin = useAppSelector((state) => isAdmin(state))
2223

2324
const router = useRouter()
2425

@@ -52,6 +53,13 @@ export default function Moderation() {
5253
))
5354
}
5455

56+
useEffect(() => {
57+
async function checkAdmin() {
58+
if (!isValidAdmin) redirectTo("/settings")
59+
}
60+
checkAdmin()
61+
}, [])
62+
5563
return (
5664
<main className="flex min-h-full mx-auto max-w-7xl px-2 sm:px-6 lg:px-8">
5765
<div className="p-5">

{{cookiecutter.project_slug}}/frontend/app/recover-password/page.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
"use client"
22

33
import Link from "next/link"
4-
import { useAppDispatch } from "../lib/hooks"
4+
import { useAppDispatch, useAppSelector } from "../lib/hooks"
55
import { useForm } from "react-hook-form"
6-
import { recoverPassword } from "../lib/slices/authSlice"
6+
import { loggedIn, recoverPassword } from "../lib/slices/authSlice"
77
import { useRouter } from "next/navigation"
8-
import Image from "next/image"
8+
import { useEffect } from "react"
9+
import { RootState } from "../lib/store"
910

1011
const redirectRoute = "/"
1112
const schema = {
@@ -14,6 +15,7 @@ const schema = {
1415

1516
export default function RecoverPassword() {
1617
const dispatch = useAppDispatch()
18+
const isLoggedIn = useAppSelector((state: RootState) => loggedIn(state))
1719

1820
const router = useRouter()
1921

@@ -33,6 +35,10 @@ export default function RecoverPassword() {
3335
router.push(redirectRoute)
3436
}
3537

38+
useEffect(() => {
39+
if (isLoggedIn) router.push(redirectRoute)
40+
})
41+
3642
return (
3743
<main className="flex min-h-full">
3844
<div className="flex flex-1 flex-col justify-center py-12 px-4 sm:px-6 lg:flex-none lg:px-20 xl:px-24">

{{cookiecutter.project_slug}}/frontend/app/reset-password/page.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ export default function ResetPassword() {
4848
} = useForm()
4949

5050
async function submit(values: any) {
51-
console.log(values.password, query)
5251
await dispatch(resetPassword(values.password, query.get("token") as string))
5352
await new Promise((resolve) => {
5453
setTimeout(() => {

{{cookiecutter.project_slug}}/frontend/app/settings/page.tsx

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,25 @@ import { KeyIcon, UserCircleIcon, UsersIcon } from "@heroicons/react/24/outline"
44
import ValidateEmailButton from "../components/settings/ValidateEmailButton"
55
import Profile from "../components/settings/Profile"
66
import Security from "../components/settings/Security"
7-
import { useState } from "react"
7+
import { useState, useEffect } from "react"
88
import { useRouter } from "next/navigation"
99
import { useAppSelector } from "../lib/hooks"
1010
import { RootState } from "../lib/store"
11-
import { profile } from "../lib/slices/authSlice"
11+
import { loggedIn, profile } from "../lib/slices/authSlice"
1212

1313
const navigation = [
1414
{ name: "Account", id: "ACCOUNT", icon: UserCircleIcon },
1515
{ name: "Security", id: "SECURITY", icon: KeyIcon },
1616
]
17-
const title = "Settings"
18-
const description = "Update your personal settings, or delete your account."
1917

2018
export default function Settings() {
2119
const [selected, changeSelection] = useState("ACCOUNT")
2220
const currentProfile = useAppSelector((state: RootState) => profile(state))
21+
const isLoggedIn = useAppSelector((state: RootState) => loggedIn(state))
2322

2423
const router = useRouter()
24+
const redirectTo = (to: string) => router.push(to)
25+
2526

2627
const renderNavigation = () => {
2728
return navigation.map((item) => (
@@ -49,6 +50,14 @@ export default function Settings() {
4950
))
5051
}
5152

53+
useEffect(() => {
54+
async function checkLoggedIn() {
55+
if (!isLoggedIn) redirectTo("/")
56+
}
57+
checkLoggedIn()
58+
}, [])
59+
60+
5261
return (
5362
<main className="flex min-h-full mx-auto max-w-7xl px-2 sm:px-6 lg:px-8">
5463
<div className="p-5">

{{cookiecutter.project_slug}}/frontend/middleware.ts

Lines changed: 0 additions & 53 deletions
This file was deleted.

0 commit comments

Comments
 (0)