Handle token renewal and expiration

This commit is contained in:
Pierre HUBERT 2025-03-20 20:51:58 +01:00
parent c6f7830d9d
commit 133d0de084
3 changed files with 34 additions and 6 deletions

View File

@ -160,7 +160,20 @@ impl FromRequest for AuthExtractor {
)); ));
}; };
// TODO : update token last activity & expiration // Update last use (if needed)
if token.shall_update_time_used() {
if let Err(e) = tokens_service::update_time_used(&token).await {
log::error!("Failed to refresh last usage of token! {}", e);
}
}
// Handle tokens expiration
if token.is_expired() {
log::error!("Attempted to use expired token! {:?}", token);
return Err(actix_web::error::ErrorBadRequest(
"Token has expired!",
));
}
return Ok(Self { return Ok(Self {
method: AuthenticatedMethod::Token(token), method: AuthenticatedMethod::Token(token),

View File

@ -82,7 +82,7 @@ export function CreateTokenDialog(p: {
return ( return (
<Dialog open={p.open} onClose={cancel}> <Dialog open={p.open} onClose={cancel}>
<DialogTitle>Nouveau jeton</DialogTitle> <DialogTitle>New token</DialogTitle>
<DialogContent> <DialogContent>
<TextInput <TextInput
editable editable

View File

@ -1,5 +1,5 @@
import DeleteIcon from "@mui/icons-material/DeleteOutlined"; import DeleteIcon from "@mui/icons-material/DeleteOutlined";
import { Alert, AlertTitle, Button } from "@mui/material"; import { Alert, AlertTitle, Button, IconButton, Tooltip } from "@mui/material";
import { import {
DataGrid, DataGrid,
GridActionsCellItem, GridActionsCellItem,
@ -18,6 +18,8 @@ import { MoneyMgrWebRouteContainer } from "../widgets/MoneyMgrWebRouteContainer"
import { TimeWidget } from "../widgets/TimeWidget"; import { TimeWidget } from "../widgets/TimeWidget";
import { QRCodeCanvas } from "qrcode.react"; import { QRCodeCanvas } from "qrcode.react";
import { APIClient } from "../api/ApiClient"; import { APIClient } from "../api/ApiClient";
import AddIcon from "@mui/icons-material/Add";
import RefreshIcon from "@mui/icons-material/Refresh";
export function TokensRoute(): React.ReactElement { export function TokensRoute(): React.ReactElement {
const count = React.useRef(0); const count = React.useRef(0);
@ -138,11 +140,11 @@ function TokensRouteInner(p: {
}, },
}, },
{ {
field: "last_used", field: "time_used",
headerName: "Last usage", headerName: "Last usage",
flex: 3, flex: 3,
renderCell(params) { renderCell(params) {
return <TimeWidget time={params.row.last_used} />; return <TimeWidget time={params.row.time_used} />;
}, },
}, },
{ {
@ -211,7 +213,20 @@ function TokensRouteInner(p: {
return ( return (
<MoneyMgrWebRouteContainer <MoneyMgrWebRouteContainer
label="API Tokens" label="API Tokens"
actions={<Button onClick={p.onRequestCreateToken}>New</Button>} actions={
<span>
<Tooltip title="Create new token">
<IconButton onClick={p.onRequestCreateToken}>
<AddIcon />
</IconButton>
</Tooltip>
<Tooltip title="Refresh table">
<IconButton onClick={p.onReload}>
<RefreshIcon />
</IconButton>
</Tooltip>
</span>
}
> >
{p.createdToken && <CreatedToken token={p.createdToken} />} {p.createdToken && <CreatedToken token={p.createdToken} />}
<DataGrid <DataGrid