41 lines
994 B
Rust
41 lines
994 B
Rust
use axum::Json;
|
|
use axum::http::HeaderMap;
|
|
use axum::routing::get;
|
|
use axum::{Extension, http::StatusCode};
|
|
use serde::Deserialize;
|
|
|
|
use crate::auth::{create_jwt, verify_jwt};
|
|
use crate::errors::APIError;
|
|
|
|
#[derive(sqlx::FromRow, serde::Serialize, Deserialize)]
|
|
pub struct WsAuthQuery {
|
|
pub token: String,
|
|
}
|
|
|
|
pub fn routes() -> axum::Router {
|
|
axum::Router::new().route("/ws/issue-token", get(issue_ws_token))
|
|
}
|
|
|
|
pub async fn issue_ws_token(
|
|
Extension(db): Extension<sqlx::PgPool>,
|
|
headers: HeaderMap,
|
|
) -> Result<(StatusCode, Json<WsAuthQuery>), APIError> {
|
|
let claims = verify_jwt(headers)?;
|
|
|
|
tracing::debug!("Recieved token issue request from user {}", claims.sub);
|
|
|
|
let token = create_jwt(claims.sub)?;
|
|
|
|
sqlx::query(
|
|
r#"
|
|
insert into ws_token_ (token, expires_at)
|
|
values ($1, now() + interval '30 seconds')
|
|
"#,
|
|
)
|
|
.bind(&token)
|
|
.execute(&db)
|
|
.await?;
|
|
|
|
Ok((StatusCode::CREATED, Json(WsAuthQuery { token })))
|
|
}
|