diff --git a/api/rpk-api/hub/auth/__init__.py b/api/rpk-api/hub/auth/__init__.py index 6376dd5..97e02af 100644 --- a/api/rpk-api/hub/auth/__init__.py +++ b/api/rpk-api/hub/auth/__init__.py @@ -4,7 +4,7 @@ import uuid from beanie import PydanticObjectId from fastapi import Depends from fastapi_users import UUIDIDMixin, BaseUserManager, FastAPIUsers, schemas -from fastapi_users.authentication import AuthenticationBackend, BearerTransport +from fastapi_users.authentication import AuthenticationBackend, BearerTransport, CookieTransport from fastapi_users.authentication.strategy import AccessTokenDatabase, DatabaseStrategy from fastapi_users_db_beanie.access_token import BeanieBaseAccessTokenDocument, BeanieAccessTokenDatabase from httpx_oauth.clients.google import GoogleOAuth2 @@ -19,7 +19,8 @@ discord_oauth_client = DiscordOAuth2(os.getenv("DISCORD_CLIENT_ID"), os.getenv(" TOKEN_LIFETIME = 3600 -bearer_transport = BearerTransport(tokenUrl="auth/login") +# bearer_transport = BearerTransport(tokenUrl="auth/login") +cookie_transport = CookieTransport(cookie_name="rpkapiusersauth") class AccessToken(BeanieBaseAccessTokenDocument): @@ -44,10 +45,7 @@ async def get_user_manager(user_db=Depends(get_user_db)): yield UserManager(user_db) -auth_backend = AuthenticationBackend( - name="db", - transport=bearer_transport, - get_strategy=get_database_strategy, +auth_backend = AuthenticationBackend(name="db", transport=cookie_transport, get_strategy=get_database_strategy, ) fastapi_users = FastAPIUsers[User, PydanticObjectId](get_user_manager, [auth_backend]) diff --git a/docker-compose.yml b/docker-compose.yml index b91149f..3810452 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ services: api: build: context: ./api - #image: roleplay-contracts-api-dev + image: roleplay-contracts-api-dev env_file: "./.env" restart: always ports: @@ -16,21 +16,21 @@ services: - "traefik.http.routers.back.rule=PathPrefix(`/api/v1/`)" - "traefik.http.services.back.loadbalancer.server.port=8000" -# gui: -# build: -# context: ./gui -# image: roleplay-contracts-gui-dev -# restart: always -# ports: -# - "4200:4200" -# volumes: -# - ./gui/rpk-gui/src:/app/src -# - ./gui/rpk-gui/public:/app/public -# labels: -# - "traefik.enable=true" -# - "traefik.http.routers.front.entrypoints=web" -# - "traefik.http.routers.front.rule=PathPrefix(`/`)" -# - "traefik.http.services.front.loadbalancer.server.port=4200" + gui: + build: + context: ./gui + image: roleplay-contracts-gui-dev + restart: always + ports: + - "4200:4200" + volumes: + - ./gui/rpk-gui/src:/app/src + - ./gui/rpk-gui/public:/app/public + labels: + - "traefik.enable=true" + - "traefik.http.routers.front.entrypoints=web" + - "traefik.http.routers.front.rule=PathPrefix(`/`)" + - "traefik.http.services.front.loadbalancer.server.port=4200" proxy: image: traefik:latest diff --git a/gui/Dockerfile b/gui/Dockerfile new file mode 100644 index 0000000..f1bded9 --- /dev/null +++ b/gui/Dockerfile @@ -0,0 +1,13 @@ +FROM node:lts-alpine + +WORKDIR /app +RUN npm install -g @angular/cli http-server +COPY rpk-gui/package*.json ./ +RUN npm install +COPY rpk-gui/ . + +RUN npm run build + +EXPOSE 4200 + +CMD [ "npm", "run", "ng", "serve", "--", "--host", "0.0.0.0", "--disable-host-check" ] diff --git a/gui/rpk-gui/package-lock.json b/gui/rpk-gui/package-lock.json index df0172c..c610575 100644 --- a/gui/rpk-gui/package-lock.json +++ b/gui/rpk-gui/package-lock.json @@ -17,8 +17,8 @@ }, "devDependencies": { "@eslint/js": "^9.21.0", - "@types/react": "^19.0.10", - "@types/react-dom": "^19.0.4", + "@types/react": "^19.1.0", + "@types/react-dom": "^19.1.1", "@vitejs/plugin-react": "^4.3.4", "eslint": "^9.21.0", "eslint-plugin-react-hooks": "^5.1.0", @@ -2066,20 +2066,18 @@ "peer": true }, "node_modules/@types/react": { - "version": "19.0.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.12.tgz", - "integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==", - "license": "MIT", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz", + "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==", "dependencies": { "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", - "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==", "dev": true, - "license": "MIT", "peerDependencies": { "@types/react": "^19.0.0" } diff --git a/gui/rpk-gui/package.json b/gui/rpk-gui/package.json index 7d67090..2584239 100644 --- a/gui/rpk-gui/package.json +++ b/gui/rpk-gui/package.json @@ -15,13 +15,12 @@ "better-auth": "^1.2.5", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router": "^7.4.1", - "react-router-auth" + "react-router": "^7.4.1" }, "devDependencies": { "@eslint/js": "^9.21.0", - "@types/react": "^19.0.10", - "@types/react-dom": "^19.0.4", + "@types/react": "^19.1.0", + "@types/react-dom": "^19.1.1", "@vitejs/plugin-react": "^4.3.4", "eslint": "^9.21.0", "eslint-plugin-react-hooks": "^5.1.0", diff --git a/gui/rpk-gui/src/App.tsx b/gui/rpk-gui/src/App.tsx index 24a05dc..356e257 100644 --- a/gui/rpk-gui/src/App.tsx +++ b/gui/rpk-gui/src/App.tsx @@ -1,12 +1,16 @@ +//https://www.robinwieruch.de/react-router-private-routes/ + import { useState } from 'react' import reactLogo from './assets/react.svg' import viteLogo from '/vite.svg' import './App.css' -import {createBrowserRouter, Link, RouterProvider} from "react-router"; -import { EntityList } from "./page/entities/list.tsx"; +import {createBrowserRouter, Link, Route, RouterProvider, Routes} from "react-router"; +import { EntityList } from "./pages/entities/List.tsx"; +import {ProtectedRoute} from "./pages/auth/ProtectedRoute.tsx"; function App() { + const [user, setUser] = useState(null) const [count, setCount] = useState(0) const router = createBrowserRouter([ @@ -23,8 +27,13 @@ function App() { return ( <> - + + INDEX } /> + }> + PROTECTED ROUTE} /> + +
Vite logo diff --git a/gui/rpk-gui/src/pages/auth/Login.tsx b/gui/rpk-gui/src/pages/auth/Login.tsx new file mode 100644 index 0000000..e2de31d --- /dev/null +++ b/gui/rpk-gui/src/pages/auth/Login.tsx @@ -0,0 +1,14 @@ + +export const Login = () => { + async function handleLogin(e: any) { + e.preventDefault() + } + + return ( +
+ + + +
+ ) +} diff --git a/gui/rpk-gui/src/pages/auth/ProtectedRoute.tsx b/gui/rpk-gui/src/pages/auth/ProtectedRoute.tsx new file mode 100644 index 0000000..839cbb8 --- /dev/null +++ b/gui/rpk-gui/src/pages/auth/ProtectedRoute.tsx @@ -0,0 +1,16 @@ +import {Navigate, Outlet} from "react-router"; + +type AuthUser = { id: string; name: string }; + +type ProtectedRouteProps = { + user: AuthUser | null; + redirectPath?: string; +}; + +export const ProtectedRoute = ({ user, redirectPath = "/" }: ProtectedRouteProps) => { + if (!user) { + return ; + } + + return ; +}; diff --git a/gui/rpk-gui/src/pages/auth/Register.tsx b/gui/rpk-gui/src/pages/auth/Register.tsx new file mode 100644 index 0000000..08e4cb2 --- /dev/null +++ b/gui/rpk-gui/src/pages/auth/Register.tsx @@ -0,0 +1,15 @@ + +export const Register = () => { + async function handleRegister(e: any) { + e.preventDefault() + } + + return ( +
+ + + + +
+ ) +} diff --git a/gui/rpk-gui/src/page/entities/list.tsx b/gui/rpk-gui/src/pages/entities/List.tsx similarity index 55% rename from gui/rpk-gui/src/page/entities/list.tsx rename to gui/rpk-gui/src/pages/entities/List.tsx index d48e73f..fe0fa92 100644 --- a/gui/rpk-gui/src/page/entities/list.tsx +++ b/gui/rpk-gui/src/pages/entities/List.tsx @@ -1,6 +1,6 @@ -export const EntityList = (props: any) => { +export const EntityList = () => { return (

List des entity: Yoyoyo

)