Skip to content
Clone
b6f7f73
63 lines 2.0 KB Rust
use crate::events::{Labels, label};
use crate::server::AuthSvc;
use crate::server::errors::AuthResult;
use crate::server::http::token::types::{
DEFAULT_TTL_SECS, MAX_TTL_SECS, TOKEN_TYPE, TokenRequest, TokenResponse,
};
use crate::server::share::issue;
impl AuthSvc {
#[tracing::instrument(skip_all, fields(user_id = user_id, request_id = %request_id.unwrap_or_default()))]
pub async fn issue_user_token(
&self,
session: &crate::session::Session,
user_id: i64,
request: TokenRequest,
request_id: Option<&str>,
) -> AuthResult<TokenResponse> {
let app_id = request
.app_id
.as_deref()
.map(str::trim)
.filter(|value| !value.is_empty())
.map(str::to_owned);
if let Some(app_id) = app_id.as_deref() {
self.apps()
.find(app_id)
.ok_or(crate::server::errors::AuthError::AppNotFound)?;
}
let issued = issue::issue_user_claims(
self,
session,
user_id,
app_id,
crate::jwt::PLATFORM_AUDIENCE.to_owned(),
request.ttl_seconds,
DEFAULT_TTL_SECS,
MAX_TTL_SECS,
request_id,
)
.await?;
let response = TokenResponse {
token: issued.token,
token_type: TOKEN_TYPE.to_owned(),
kid: issued.kid,
issued_at: issue::timestamp(issued.issued_at, "token")?,
expires_at: issue::timestamp(issued.expires_at, "token")?,
};
self.emit_labeled(
label::AUTH_APP_TOKEN_CREATE,
Labels::new().with(label::USER_ID, user_id),
serde_json::json!({
"audience": crate::jwt::PLATFORM_AUDIENCE,
"kid": &response.kid,
"issued_at": response.issued_at,
"expires_at": response.expires_at,
}),
request_id,
)
.await;
Ok(response)
}
}