feat: added logout
This commit is contained in:
parent
a293bd34ee
commit
427612b11f
|
|
@ -5,7 +5,7 @@ mod templates;
|
||||||
mod web_api;
|
mod web_api;
|
||||||
mod web_app;
|
mod web_app;
|
||||||
|
|
||||||
use axum::Router;
|
use axum::{response::Redirect, routing::get, Router};
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
|
|
@ -19,12 +19,13 @@ async fn main() {
|
||||||
|
|
||||||
let state = AppState { gotrue_client };
|
let state = AppState { gotrue_client };
|
||||||
|
|
||||||
let web_api_router = web_api::router().with_state(state.clone());
|
|
||||||
let web_app_router = web_app::router();
|
let web_app_router = web_app::router();
|
||||||
|
let web_api_router = web_api::router().with_state(state);
|
||||||
|
|
||||||
let app = Router::new()
|
let app = Router::new()
|
||||||
.nest_service("/web-api", web_api_router)
|
.route("/", get(|| async { Redirect::permanent("/web") }))
|
||||||
.nest_service("/", web_app_router);
|
.nest_service("/web", web_app_router)
|
||||||
|
.nest_service("/web-api", web_api_router);
|
||||||
|
|
||||||
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
|
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
|
||||||
.serve(app.into_make_service())
|
.serve(app.into_make_service())
|
||||||
|
|
|
||||||
|
|
@ -3,3 +3,7 @@ use askama::Template;
|
||||||
#[derive(Template)]
|
#[derive(Template)]
|
||||||
#[template(path = "login.html")]
|
#[template(path = "login.html")]
|
||||||
pub struct Login;
|
pub struct Login;
|
||||||
|
|
||||||
|
#[derive(Template)]
|
||||||
|
#[template(path = "home.html")]
|
||||||
|
pub struct Home;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ use crate::error::RenderError;
|
||||||
use askama::Template;
|
use askama::Template;
|
||||||
use axum::response::Result;
|
use axum::response::Result;
|
||||||
use axum::{response::Html, routing::get, Router};
|
use axum::{response::Html, routing::get, Router};
|
||||||
use axum_extra::extract::cookie::{Cookie, CookieJar};
|
use axum_extra::extract::cookie::CookieJar;
|
||||||
|
|
||||||
use crate::templates;
|
use crate::templates;
|
||||||
|
|
||||||
|
|
@ -11,17 +11,15 @@ pub fn router() -> Router {
|
||||||
.route("/", get(home_handler))
|
.route("/", get(home_handler))
|
||||||
.route("/home", get(home_handler))
|
.route("/home", get(home_handler))
|
||||||
.route("/login", get(login_handler))
|
.route("/login", get(login_handler))
|
||||||
|
|
||||||
// for testing and debugging
|
|
||||||
.route("/setcookie", get(set_cookie_handler))
|
|
||||||
.route("/resetcookie", get(reset_cookie_handler))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn home_handler(cookies: CookieJar) -> Result<Html<String>, RenderError> {
|
pub async fn home_handler(cookies: CookieJar) -> Result<Html<String>, RenderError> {
|
||||||
println!("cookies: {:?}", cookies);
|
|
||||||
let access_token = cookies.get("access_token");
|
let access_token = cookies.get("access_token");
|
||||||
match access_token {
|
match access_token {
|
||||||
Some(access_token) => Ok(Html(access_token.to_string())), // TODO: render home page
|
Some(access_token) => {
|
||||||
|
let s = templates::Home {}.render()?;
|
||||||
|
Ok(Html(s))
|
||||||
|
},
|
||||||
None => login_handler().await,
|
None => login_handler().await,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -30,11 +28,3 @@ pub async fn login_handler() -> Result<Html<String>, RenderError> {
|
||||||
let s = templates::Login {}.render()?;
|
let s = templates::Login {}.render()?;
|
||||||
Ok(Html(s))
|
Ok(Html(s))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn set_cookie_handler(jar: CookieJar) -> CookieJar {
|
|
||||||
jar.add(Cookie::new("access_token", "test"))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn reset_cookie_handler(jar: CookieJar) -> CookieJar {
|
|
||||||
jar.remove(Cookie::new("access_token", ""))
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<body>
|
||||||
|
<h1>Welcome to the Home Page</h1>
|
||||||
|
<button id="logoutBtn">Logout</button>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document
|
||||||
|
.getElementById("logoutBtn")
|
||||||
|
.addEventListener("click", function () {
|
||||||
|
// Remove the cookie by setting its value to an empty string and its expiry date to the past.
|
||||||
|
document.cookie =
|
||||||
|
"access_token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
|
||||||
|
|
||||||
|
// Redirect to the login page.
|
||||||
|
window.location.href = "/web/login";
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -1,62 +1,65 @@
|
||||||
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
|
<body>
|
||||||
<body>
|
|
||||||
<h1>Admin Login</h1>
|
<h1>Admin Login</h1>
|
||||||
<form id="loginForm">
|
<form id="loginForm">
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<label for="email">Email:</label>
|
<label for="email">Email:</label>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" id="email" name="email" required />
|
<input type="text" id="email" name="email" required />
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<label for="password">Password:</label>
|
<label for="password">Password:</label>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="password" id="password" name="password" required />
|
<input type="password" id="password" name="password" required />
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<button type="button" id="submitBtn">Submit</button>
|
<button type="button" id="submitBtn">Submit</button>
|
||||||
</form>
|
</form>
|
||||||
<div id="response"></div>
|
<div id="response"></div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
document.getElementById('submitBtn').addEventListener('click', function () {
|
document
|
||||||
var data = {
|
.getElementById("submitBtn")
|
||||||
email: document.getElementById('email').value,
|
.addEventListener("click", function () {
|
||||||
password: document.getElementById('password').value
|
var data = {
|
||||||
};
|
email: document.getElementById("email").value,
|
||||||
fetch('/web-api/login', {
|
password: document.getElementById("password").value,
|
||||||
method: 'POST',
|
};
|
||||||
headers: {
|
fetch("/web-api/login", {
|
||||||
'Content-Type': 'application/json',
|
method: "POST",
|
||||||
},
|
headers: {
|
||||||
body: JSON.stringify(data),
|
"Content-Type": "application/json",
|
||||||
})
|
},
|
||||||
.then(response => {
|
body: JSON.stringify(data),
|
||||||
if (!response.ok) {
|
})
|
||||||
// If HTTP status code is not OK, throw an error with the status text
|
.then((response) => {
|
||||||
throw Error(response.statusText);
|
if (!response.ok) {
|
||||||
}
|
// If HTTP status code is not OK, throw an error with the status text
|
||||||
// Parse the JSON response
|
throw Error(response.statusText);
|
||||||
return response.json();
|
}
|
||||||
})
|
// Parse the JSON response
|
||||||
.then(data => {
|
return response.json();
|
||||||
// Set the token as a cookie
|
})
|
||||||
document.cookie = "access_token=" + data.data.access_token + "; path=/";
|
.then((data) => {
|
||||||
window.location.href = "/home";
|
// Set the token as a cookie
|
||||||
})
|
document.cookie =
|
||||||
.catch((error) => {
|
"access_token=" + data.data.access_token + "; path=/";
|
||||||
console.error('Error:', error);
|
window.location.href = "/";
|
||||||
document.getElementById('response').innerText = 'Login failed: ' + error.message;
|
})
|
||||||
});
|
.catch((error) => {
|
||||||
});
|
console.error("Error:", error);
|
||||||
|
document.getElementById("response").innerText =
|
||||||
|
"Login failed: " + error.message;
|
||||||
|
});
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue