zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
use crate::prelude2::*;

use crate::core::auth0::jwt_token::Claims;
use crate::core::auth0::jwt_token::JwtToken;

// https://jwt.io/
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"; // 秘钥匙(和加密的时候一样的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))
}