summaryrefslogtreecommitdiff
path: root/examples/middleware/src
diff options
context:
space:
mode:
authorGravatar Princesseuh <3019731+Princesseuh@users.noreply.github.com> 2024-08-20 14:29:50 +0200
committerGravatar Princesseuh <3019731+Princesseuh@users.noreply.github.com> 2024-08-20 14:29:50 +0200
commit787fed8504e7ec604d96ff266f58db715e84f736 (patch)
treeef29a659ddf6511e2564ee4d442f992cc9695241 /examples/middleware/src
parent6617491c3bc2bde87f7867d7dec2580781852cfc (diff)
parentc6622adaeb405e961b12c91f0e5d02c7333d01cf (diff)
downloadastro-787fed8504e7ec604d96ff266f58db715e84f736.tar.gz
astro-787fed8504e7ec604d96ff266f58db715e84f736.tar.zst
astro-787fed8504e7ec604d96ff266f58db715e84f736.zip
Merge branch 'main' into next
Diffstat (limited to 'examples/middleware/src')
-rw-r--r--examples/middleware/src/middleware.ts31
-rw-r--r--examples/middleware/src/pages/admin.astro5
-rw-r--r--examples/middleware/src/pages/api/login.ts21
-rw-r--r--examples/middleware/src/pages/api/logout.ts5
-rw-r--r--examples/middleware/src/pages/index.astro2
-rw-r--r--examples/middleware/src/pages/login.astro1
6 files changed, 54 insertions, 11 deletions
diff --git a/examples/middleware/src/middleware.ts b/examples/middleware/src/middleware.ts
index f92b64d44..4854105ca 100644
--- a/examples/middleware/src/middleware.ts
+++ b/examples/middleware/src/middleware.ts
@@ -56,16 +56,27 @@ const validation = defineMiddleware(async (context, next) => {
} else if (context.request.url.endsWith('/api/login')) {
const response = await next();
// the login endpoint will return to us a JSON with username and password
- const data = await response.json();
- // we naively check if username and password are equals to some string
- if (data.username === 'astro' && data.password === 'astro') {
- // we store the token somewhere outside of locals because the `locals` object is attached to the request
- // and when doing a redirect, we lose that information
- loginInfo.token = 'loggedIn';
- loginInfo.currentTime = new Date().getTime();
- return context.redirect('/admin');
- }
- }
+ if (response.headers.get('content-type') === 'application/json') {
+ const data = await response.json();
+ // we naively check if username and password are equals to some string
+ if (data.username === 'astro' && data.password === 'astro') {
+ // we store the token somewhere outside of locals because the `locals` object is attached to the request
+ // and when doing a redirect, we lose that information
+ loginInfo.token = 'loggedIn';
+ loginInfo.currentTime = new Date().getTime();
+ return context.redirect('/admin');
+ }
+ }
+ return response;
+ } else if (context.request.url.endsWith('/api/logout')) {
+ const response = await next();
+ if (response.ok) {
+ loginInfo.token = undefined;
+ loginInfo.currentTime = undefined;
+ return context.redirect('/login');
+ }
+ return response;
+ }
return next();
});
diff --git a/examples/middleware/src/pages/admin.astro b/examples/middleware/src/pages/admin.astro
index 028fd6b08..921758228 100644
--- a/examples/middleware/src/pages/admin.astro
+++ b/examples/middleware/src/pages/admin.astro
@@ -1,11 +1,16 @@
---
import Layout from '../layouts/Layout.astro';
+import Card from '../components/Card.astro';
const user = Astro.locals.user;
---
<Layout title="Welcome back!!">
<main>
<h1>Welcome back <span class="text-gradient">{user.name} {user.surname}</span></h1>
+ {}
+ <ul role="list" class="link-card-grid">
+ <Card href="/api/logout" title="Logout" body="Logout now" />
+ </ul>
</main>
</Layout>
diff --git a/examples/middleware/src/pages/api/login.ts b/examples/middleware/src/pages/api/login.ts
new file mode 100644
index 000000000..24012444c
--- /dev/null
+++ b/examples/middleware/src/pages/api/login.ts
@@ -0,0 +1,21 @@
+import type { APIRoute, APIContext } from "astro";
+
+export const POST: APIRoute = async (context: APIContext) => {
+ try {
+ const data = await context.request.formData();
+ return new Response(
+ JSON.stringify({
+ username: data.get("username"),
+ password: data.get("password"),
+ }),
+ {
+ headers: { "Content-Type": "application/json" },
+ }
+ );
+ } catch (e) {
+ if (e instanceof Error) {
+ console.error(e.message);
+ }
+ }
+ return new Response(null, { status: 400 });
+};
diff --git a/examples/middleware/src/pages/api/logout.ts b/examples/middleware/src/pages/api/logout.ts
new file mode 100644
index 000000000..b6c6e9e06
--- /dev/null
+++ b/examples/middleware/src/pages/api/logout.ts
@@ -0,0 +1,5 @@
+import type { APIRoute, APIContext } from "astro";
+
+export const GET: APIRoute = async (_: APIContext) => {
+ return new Response(null, { status: 200 });
+};
diff --git a/examples/middleware/src/pages/index.astro b/examples/middleware/src/pages/index.astro
index ff77d4a15..bd934ff94 100644
--- a/examples/middleware/src/pages/index.astro
+++ b/examples/middleware/src/pages/index.astro
@@ -12,7 +12,7 @@ import Card from '../components/Card.astro';
</p>
{}
<ul role="list" class="link-card-grid">
- <Card href="/login" title="Login" body="Try the login" />
+ <Card href="/login" title="Login" body="Try the login with astro/astro" />
</ul>
</main>
</Layout>
diff --git a/examples/middleware/src/pages/login.astro b/examples/middleware/src/pages/login.astro
index 99cf4cc94..697f6819c 100644
--- a/examples/middleware/src/pages/login.astro
+++ b/examples/middleware/src/pages/login.astro
@@ -14,6 +14,7 @@ if (status === 301) {
<p class="instructions">
To get started, open the directory <code>src/pages</code> in your project.<br />
<strong>Code Challenge:</strong> Tweak the "Welcome to Astro" message above.
+ <strong>Login with:</strong> Username: <code>astro</code> Password: <code>astro</code>
</p>
{redirectMessage}
<form action="/api/login" method="POST">