use crate::prelude2::*;
use crate::core::auth0::jwt_token::Claims;
use crate::core::auth0::jwt_token::JwtToken;
pub async fn jwt_encode(jti: web::Path<String>) -> Result<HttpResponse> {
let jti: String = jti.into_inner();
let exp = (chrono::Utc::now() + chrono::Duration::try_days(7).unwrap()).timestamp();
let key = "super-long-and-jwt-secret-random-key";
let now = crate::commons::timestamp_millis();
let app_name = crate::commons::read_env("APP_NAME", "APP_NAME_UNSET");
let claims: Claims = Claims {
exp,
iss: app_name.clone(),
sub: jti.clone(),
aud: app_name,
iat: now,
nbf: now - 5000,
jti: uuid::Uuid::now_v7().to_string(),
};
let token: String = jsonwebtoken::encode(
&jsonwebtoken::Header::new(jsonwebtoken::Algorithm::HS256),
&claims,
&jsonwebtoken::EncodingKey::from_secret(key.as_bytes()),
)
.map_err(|e| Error::throw("jwt加密失败", Some(e)))?;
let response = HttpResponse::Ok().json(R::ok(token));
Ok(response)
}
pub async fn jwt_decode(_key: web::Path<String>, jwt_token: web::Bytes) -> Result<HttpResponse> {
let jwt_token = crate::commons::bytes_to_string(jwt_token.to_vec())?;
let key = "super-long-and-jwt-secret-random-key";
let token = jsonwebtoken::decode::<Claims>(
&jwt_token,
&jsonwebtoken::DecodingKey::from_secret(key.as_bytes()),
&jsonwebtoken::Validation::new(jsonwebtoken::Algorithm::HS256),
)
.map_err(|e| {
log::error!("jwt_decode: {:?}", e);
anyhow::anyhow!(e)
})?;
let response = HttpResponse::Ok().json(R::ok(token.claims));
Ok(response)
}
pub async fn jwt_protected(jwt_token: JwtToken, request: HttpRequest) -> impl Responder {
request.json(200, R::ok(jwt_token))
}