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 }))
}
Write a new endpoint /api/v1/me that returns the user their username when given the token in the auth header