Login route, database compose file
Some checks failed
Build Backend and Frontend / Build & Test .NET Backend (push) Has been cancelled
Build Backend and Frontend / Build Frontend (push) Has been cancelled

This commit is contained in:
Simon Lübeß
2025-06-04 16:42:13 +02:00
parent efd69f63b0
commit a5727f0f51
5 changed files with 104 additions and 21 deletions

View File

@ -45,16 +45,16 @@ AuthenticationSettings? authSettings = authSettingsSection.Get<AuthenticationSet
// ValidateAudience = false // ValidateAudience = false
// }; // };
// }); // });
//
builder.Services.AddAuthorization(options => // builder.Services.AddAuthorization(options =>
{ // {
options.AddPolicy(nameof(UserRole.Developer), policy => policy.RequireRole(nameof(UserRole.Developer))); // options.AddPolicy(nameof(UserRole.Developer), policy => policy.RequireRole(nameof(UserRole.Developer)));
options.AddPolicy(nameof(UserRole.User), policy => // options.AddPolicy(nameof(UserRole.User), policy =>
{ // {
// Also allow Developers to do anything a user can do. // // Also allow Developers to do anything a user can do.
policy.RequireRole(nameof(UserRole.User), nameof(UserRole.Developer)); // policy.RequireRole(nameof(UserRole.User), nameof(UserRole.Developer));
}); // });
}); // });
builder.Services.AddDbContext<ApplicationDbContext>(options => builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString("Default"))); options.UseNpgsql(builder.Configuration.GetConnectionString("Default")));
@ -145,6 +145,27 @@ app.MapGet("/user", (ClaimsPrincipal user) =>
Results.Ok(new { message = $"Authenticated as { user?.Identity?.Name }" }); Results.Ok(new { message = $"Authenticated as { user?.Identity?.Name }" });
}).RequireAuthorization(nameof(UserRole.User)); }).RequireAuthorization(nameof(UserRole.User));
app.MapGet("/auth/validate", async (HttpContext context, UserManager<IdentityUser> userManager) =>
{
if (!context.User.Identity?.IsAuthenticated ?? true)
{
return Results.Unauthorized();
}
IdentityUser? user = await userManager.GetUserAsync(context.User);
if (user is null)
{
return Results.InternalServerError("User not found?!");
}
return Results.Ok(new
{
user.Id,
user.Email
});
}).RequireAuthorization();
app.MapGet("/ephemeral_token", async () => app.MapGet("/ephemeral_token", async () =>
{ {
//if (apiKey == null) //if (apiKey == null)

13
docker-compose.yml Normal file
View File

@ -0,0 +1,13 @@
# Use postgres/example user/password credentials
services:
db:
image: postgres
restart: always
# set shared memory limit when using docker compose
shm_size: 128mb
environment:
POSTGRES_USER: us-entry-agent-dev
POSTGRES_PASSWORD: example
ports:
- 5432:5432

View File

@ -5,6 +5,7 @@ import useLoginToken from "./Hooks/useLoginToken.tsx";
import Home from "./Components/Home.tsx"; import Home from "./Components/Home.tsx";
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom'; import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';
import ProtectedRoute from "./Components/ProtectedRoute.tsx"; import ProtectedRoute from "./Components/ProtectedRoute.tsx";
import {CookiesProvider} from "react-cookie";
export default function App() export default function App()
{ {
@ -22,16 +23,18 @@ export default function App()
<> <>
{/*<Navigation/>*/} {/*<Navigation/>*/}
<BrowserRouter> <CookiesProvider defaultSetOptions={{ path: '/' }}>
<Routes> <BrowserRouter>
<Route index path="/" element={ <Home /> } /> <Routes>
<Route path="login" element={ <Login setToken={setToken} /> } /> <Route index path="/" element={ <Home /> } />
<Route element={<ProtectedRoute user={token} setUser={setToken}/>}> <Route path="login" element={ <Login setToken={setToken} /> } />
<Route path="chat" element={ <ChatControl /> } /> <Route element={<ProtectedRoute user={token} setUser={setToken}/>}>
</Route> <Route path="chat" element={ <ChatControl /> } />
<Route path="*" element={ <p>Deine Mamma ist so dick, sie hat diese Seite gefressen. </p> } /> </Route>
</Routes> <Route path="*" element={ <p>Deine Mamma ist so dick, sie hat diese Seite gefressen. </p> } />
</BrowserRouter> </Routes>
</BrowserRouter>
</CookiesProvider>
</> </>
); );
} }

View File

@ -1,8 +1,54 @@
import { Outlet } from "react-router-dom"; import { Outlet } from "react-router-dom";
import Login from "./Login.tsx"; import Login from "./Login.tsx";
import { useEffect } from "react";
import { z } from 'zod/v4';
const AuthValidateResult = z.object({
id: z.string(),
email: z.string()
});
export default function ProtectedRoute({user, setUser} : {user: string | null, setUser: (user: string | null) => void}) export default function ProtectedRoute({user, setUser} : {user: string | null, setUser: (user: string | null) => void})
{ {
async function authenticateUser ()
{
try
{
console.log("Checkineasdjkf")
const response = await fetch('/auth/validate', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
if (!response.ok)
{
console.error(`Failed to validate session: ${response.status} ${response.statusText}`);
setUser(null);
return;
}
const responseJson:unknown = await response.json();
const parsedUser = AuthValidateResult.parse(responseJson);
setUser(JSON.stringify(parsedUser));
console.log("User authorized!")
}
catch (e)
{
console.error(e);
setUser(null);
}
}
useEffect(() =>
{
void authenticateUser();
});
if (user === null) if (user === null)
{ {
return <Login setToken={setUser}/>; return <Login setToken={setUser}/>;

View File

@ -44,7 +44,7 @@ const target = env.ASPNETCORE_HTTPS_PORT ? `https://localhost:${env.ASPNETCORE_H
env.ASPNETCORE_URLS ? env.ASPNETCORE_URLS.split(';')[0] : 'https://localhost:7085'; env.ASPNETCORE_URLS ? env.ASPNETCORE_URLS.split(';')[0] : 'https://localhost:7085';
// Define a list of all existing backend routes. // Define a list of all existing backend routes.
const backendRoutes = ['/login', '/register', '/ephemeral_token']; const backendRoutes = ['/login', '/register', '/ephemeral_token', '/auth/validate'];
// For development, we have a node.js server running that delivers our frontend. // For development, we have a node.js server running that delivers our frontend.
// We have to configure proxies for the backend calls, so that node.js will forward them to the backend. // We have to configure proxies for the backend calls, so that node.js will forward them to the backend.