Compare commits
1 Commits
v0.3.0-dev
...
v0.3.0-dev
Author | SHA1 | Date | |
---|---|---|---|
a58b0cb40b |
@@ -42,35 +42,23 @@ pub mod endpoint {
|
|||||||
axum::Extension(pool): axum::Extension<sqlx::PgPool>,
|
axum::Extension(pool): axum::Extension<sqlx::PgPool>,
|
||||||
Json(payload): Json<request::Request>,
|
Json(payload): Json<request::Request>,
|
||||||
) -> (StatusCode, Json<response::Response>) {
|
) -> (StatusCode, Json<response::Response>) {
|
||||||
let usr = icarus_models::user::User {
|
|
||||||
username: payload.username,
|
|
||||||
password: payload.password,
|
|
||||||
..Default::default()
|
|
||||||
};
|
|
||||||
|
|
||||||
// Check if user exists
|
// Check if user exists
|
||||||
match repo::user::exists(&pool, &usr.username).await {
|
match repo::user::get(&pool, &payload.username).await {
|
||||||
Ok(exists) => {
|
Ok(user) => {
|
||||||
if !exists {
|
|
||||||
return not_found("Not Found").await;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
return not_found(&err.to_string()).await;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let user = repo::user::get(&pool, &usr.username).await.unwrap();
|
|
||||||
let salt = repo::salt::get(&pool, &user.salt_id).await.unwrap();
|
let salt = repo::salt::get(&pool, &user.salt_id).await.unwrap();
|
||||||
let salt_str = hashing::get_salt(&salt.salt).unwrap();
|
let salt_str = hashing::get_salt(&salt.salt).unwrap();
|
||||||
|
let unhashed_password = payload.password;
|
||||||
|
|
||||||
// Check if password is correct
|
// Check if password is correct
|
||||||
match hashing::hash_password(&usr.password, &salt_str) {
|
match hashing::hash_password(&unhashed_password, &salt_str) {
|
||||||
Ok(hash_password) => {
|
Ok(hash_password) => {
|
||||||
if hashing::verify_password(&usr.password, hash_password.clone()).unwrap() {
|
if hashing::verify_password(&unhashed_password, hash_password.clone())
|
||||||
|
.unwrap()
|
||||||
|
{
|
||||||
// Create token
|
// Create token
|
||||||
let key = token_stuff::get_key().unwrap();
|
let key = token_stuff::get_key().unwrap();
|
||||||
let (token_literal, duration) = token_stuff::create_token(&key).unwrap();
|
let (token_literal, duration) =
|
||||||
|
token_stuff::create_token(&key).unwrap();
|
||||||
|
|
||||||
if token_stuff::verify_token(&key, &token_literal) {
|
if token_stuff::verify_token(&key, &token_literal) {
|
||||||
(
|
(
|
||||||
@@ -98,4 +86,9 @@ pub mod endpoint {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Err(err) => {
|
||||||
|
return not_found(&err.to_string()).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,11 +18,22 @@ pub fn get_key() -> Result<String, dotenvy::Error> {
|
|||||||
Ok(key)
|
Ok(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_expiration() -> time::Result<time::Duration> {
|
pub fn get_issued() -> time::Result<time::OffsetDateTime> {
|
||||||
let now = time::OffsetDateTime::now_utc();
|
Ok(time::OffsetDateTime::now_utc())
|
||||||
let epoch = time::OffsetDateTime::UNIX_EPOCH;
|
}
|
||||||
let since_the_epoch = now - epoch;
|
|
||||||
Ok(since_the_epoch)
|
pub fn get_expiration(issued: &time::OffsetDateTime) -> Result<time::OffsetDateTime, time::Error> {
|
||||||
|
let duration_expire = time::Duration::hours(4);
|
||||||
|
Ok(*issued + duration_expire)
|
||||||
|
}
|
||||||
|
|
||||||
|
mod util {
|
||||||
|
pub fn time_to_std_time(
|
||||||
|
provided_time: &time::OffsetDateTime,
|
||||||
|
) -> Result<std::time::SystemTime, std::time::SystemTimeError> {
|
||||||
|
let converted = std::time::SystemTime::from(*provided_time);
|
||||||
|
Ok(converted)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_token(provided_key: &String) -> Result<(String, i64), josekit::JoseError> {
|
pub fn create_token(provided_key: &String) -> Result<(String, i64), josekit::JoseError> {
|
||||||
@@ -33,13 +44,11 @@ pub fn create_token(provided_key: &String) -> Result<(String, i64), josekit::Jos
|
|||||||
payload.set_subject(MESSAGE);
|
payload.set_subject(MESSAGE);
|
||||||
payload.set_issuer(ISSUER);
|
payload.set_issuer(ISSUER);
|
||||||
payload.set_audience(vec![AUDIENCE]);
|
payload.set_audience(vec![AUDIENCE]);
|
||||||
match get_expiration() {
|
match get_issued() {
|
||||||
Ok(duration) => {
|
Ok(issued) => {
|
||||||
let expire = duration.whole_seconds();
|
let expire = get_expiration(&issued).unwrap();
|
||||||
let _ = payload.set_claim(
|
payload.set_issued_at(&util::time_to_std_time(&issued).unwrap());
|
||||||
"expiration",
|
payload.set_expires_at(&util::time_to_std_time(&expire).unwrap());
|
||||||
Some(serde_json::to_value(expire.to_string()).unwrap()),
|
|
||||||
);
|
|
||||||
|
|
||||||
let key: String = if provided_key.is_empty() {
|
let key: String = if provided_key.is_empty() {
|
||||||
get_key().unwrap()
|
get_key().unwrap()
|
||||||
@@ -50,7 +59,7 @@ pub fn create_token(provided_key: &String) -> Result<(String, i64), josekit::Jos
|
|||||||
let signer = Hs256.signer_from_bytes(key.as_bytes()).unwrap();
|
let signer = Hs256.signer_from_bytes(key.as_bytes()).unwrap();
|
||||||
Ok((
|
Ok((
|
||||||
josekit::jwt::encode_with_signer(&payload, &header, &signer).unwrap(),
|
josekit::jwt::encode_with_signer(&payload, &header, &signer).unwrap(),
|
||||||
duration.whole_seconds(),
|
(expire - time::OffsetDateTime::UNIX_EPOCH).whole_seconds(),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
Err(e) => Err(josekit::JoseError::InvalidClaim(e.into())),
|
Err(e) => Err(josekit::JoseError::InvalidClaim(e.into())),
|
||||||
|
Reference in New Issue
Block a user