xxxxxxxxxx
Jack = Dog()
print(Jack.bark("Gaw"))
xxxxxxxxxx
# Django project settings.py
from datetime import timedelta
SIMPLE_JWT = {
"ACCESS_TOKEN_LIFETIME": timedelta(minutes=5),
"REFRESH_TOKEN_LIFETIME": timedelta(days=1),
"ROTATE_REFRESH_TOKENS": False,
"BLACKLIST_AFTER_ROTATION": False,
"UPDATE_LAST_LOGIN": False,
"ALGORITHM": "HS256",
"SIGNING_KEY": settings.SECRET_KEY,
"VERIFYING_KEY": "",
"AUDIENCE": None,
"ISSUER": None,
"JSON_ENCODER": None,
"JWK_URL": None,
"LEEWAY": 0,
"AUTH_HEADER_TYPES": ("Bearer",),
"AUTH_HEADER_NAME": "HTTP_AUTHORIZATION",
"USER_ID_FIELD": "id",
"USER_ID_CLAIM": "user_id",
"USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule",
"AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
"TOKEN_TYPE_CLAIM": "token_type",
"TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser",
"JTI_CLAIM": "jti",
"SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp",
"SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),
"SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),
"TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer",
"TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer",
"TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer",
"TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer",
"SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer",
"SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer",
}
xxxxxxxxxx
// Protected Routes for JWT stored in HttpOnly cookie
// useAuth.jsx =================================================================
import { useEffect, useState } from "react"
import axios from "axios"
const api = axios.create({
baseURL: import.meta.env.VITE_SERVER_URL, // or process.env.SERVER_URL
withCredentials: true
})
const useAuth = () => {
const [isAuthenticated, setIsAuthenticated] = useState(null)
useEffect(() => {
const checkAuth = async () => {
try {
await api.get("/api/check-auth")
setIsAuthenticated(true)
} catch {
setIsAuthenticated(false)
}
}
checkAuth()
}, [])
return isAuthenticated
}
export default useAuth
// ProtectedRoutes.jsx ==========================================================
import { Navigate, Outlet } from "react-router-dom"
import useAuth from "./useAuth"
const ProtectedRoutes = () => {
const isAuthenticated = useAuth()
if (isAuthenticated === null) return <p>Loading</p>
return isAuthenticated ? <Outlet /> : <Navigate to="/login" />
}
export default ProtectedRoutes
// PublicRoutes.jsx =============================================================
import { Navigate, Outlet } from "react-router-dom"
import useAuth from "./useAuth"
const PublicRoutes = () => {
const isAuthenticated = useAuth()
if (isAuthenticated === null) return <p>Loading</p>
return isAuthenticated ? <Navigate to="/" /> : <Outlet />
}
export default PublicRoutes
// App.jsx ======================================================================
export const App = () => {
return (
<div>
<BrowserRouter>
<Routes>
<Route element={<PublicRoutes />}>
<Route path="/login" element={<Login />} />
<Route path="/signup" element={<Signup />} />
<Route path="/verification-success" element={<VerificationSuccess />} />
<Route path="/verification-error" element={<VerificationError />} />
</Route>
<Route element={<ProtectedRoutes />}>
<Route path="/" element={<Dashboard />} />
</Route>
</Routes>
</BrowserRouter>
</div>
)
}