Handle token renewal and expiration
This commit is contained in:
		@@ -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),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user