jsonwebtoken = {version = "10.2.0", features = ["rust_crypto"]}
use jsonwebtoken::{EncodingKey, Header, encode};

#[derive(Serialize, Deserialize)]
pub struct Claims {
    pub sub: String,
    pub exp: usize,
}

impl Claims {
    pub fn new(sub: String) -> Self {
        Self { sub, exp: 1000000000000000000 }
    }
}

pub async fn sign_in(data: web::Data<Store>, request: web::Json<CreateUserRequest>) -> Result<web::Json<SignInResponse>> {
    let store = data.into_inner();
    let user = store.get_user(GetUserRequest { username: request.into_inner().username }).await.map_err(|e| actix_web::error::ErrorInternalServerError(e.to_string()))?;
    let token = encode(&Header::default(), &Claims::new(user.user.id), &EncodingKey::from_secret(env::var("SECRET_KEY").unwrap().as_bytes())).map_err(|e| actix_web::error::ErrorInternalServerError(e.to_string()))?;
    Ok(web::Json(SignInResponse { token: token }))
}

Assignment - Adding an authenticated route

Write a new endpoint /api/v1/me that returns the user their username when given the token in the auth header