2021-03-26 22:30:38 +00:00
|
|
|
use serde::{Serialize, Deserialize};
|
2021-03-27 05:45:59 +00:00
|
|
|
|
2021-03-26 22:30:38 +00:00
|
|
|
use rocket_contrib::json::Json;
|
2021-03-27 05:45:59 +00:00
|
|
|
use rocket::Response;
|
|
|
|
use rocket::http::Status;
|
|
|
|
use uuid::Uuid;
|
|
|
|
use jsonwebtoken::{encode, Header, EncodingKey};
|
|
|
|
use chrono::prelude::{DateTime, Utc};
|
|
|
|
use chrono::Duration;
|
|
|
|
use chrono::serde::ts_seconds;
|
|
|
|
|
2021-03-26 22:30:38 +00:00
|
|
|
use crate::DbConn;
|
2021-03-27 05:45:59 +00:00
|
|
|
use crate::models::errors::ErrorResponse;
|
|
|
|
use crate::models::users::{LocalUser, CreateUserRequest};
|
2021-03-26 22:30:38 +00:00
|
|
|
|
|
|
|
#[derive(Debug, Serialize, Deserialize)]
|
|
|
|
struct AuthClaims {
|
|
|
|
jti: String,
|
|
|
|
sub: String,
|
2021-03-27 05:45:59 +00:00
|
|
|
#[serde(with = "ts_seconds")]
|
|
|
|
exp: DateTime<Utc>,
|
|
|
|
#[serde(with = "ts_seconds")]
|
|
|
|
iat: DateTime<Utc>,
|
2021-03-26 22:30:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Serialize)]
|
|
|
|
pub struct AuthTokenResponse {
|
|
|
|
token: String
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Deserialize)]
|
|
|
|
pub struct AuthTokenRequest {
|
2021-03-27 05:45:59 +00:00
|
|
|
username: String,
|
2021-03-26 22:30:38 +00:00
|
|
|
password: String,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[post("/users/me/token", data = "<auth_request>")]
|
2021-03-27 05:45:59 +00:00
|
|
|
pub fn create_auth_token(conn: DbConn, auth_request: Json<AuthTokenRequest>) -> Result<Json<AuthTokenResponse>, ErrorResponse<()>> {
|
|
|
|
let user_info = LocalUser::get_user_by_creds(&conn, &auth_request.username, &auth_request.password)?;
|
|
|
|
let jti = Uuid::new_v4().to_simple().to_string();
|
|
|
|
let iat = Utc::now();
|
|
|
|
let exp = iat + Duration::minutes(1);
|
|
|
|
|
|
|
|
let claims = AuthClaims {
|
|
|
|
jti: jti,
|
|
|
|
sub: user_info.id,
|
|
|
|
exp: exp,
|
|
|
|
iat: iat,
|
|
|
|
};
|
|
|
|
|
|
|
|
// TODO: catch error
|
|
|
|
let token = encode(&Header::default(), &claims, &EncodingKey::from_secret("changeme".as_ref())).unwrap();
|
2021-03-26 22:30:38 +00:00
|
|
|
|
2021-03-27 05:45:59 +00:00
|
|
|
Ok(Json(AuthTokenResponse { token }))
|
2021-03-26 22:30:38 +00:00
|
|
|
}
|
|
|
|
|
2021-03-27 05:45:59 +00:00
|
|
|
#[post("/users", data = "<user_request>")]
|
|
|
|
pub fn create_user<'r>(conn: DbConn, user_request: Json<CreateUserRequest>) -> Result<Response<'r>, ErrorResponse<()>>{
|
|
|
|
// TODO: Check current user if any to check if user has permission to create users (with or without role)
|
|
|
|
let _user_info = LocalUser::create_user(&conn, user_request.into_inner())?;
|
|
|
|
Response::build()
|
|
|
|
.status(Status::Created)
|
|
|
|
.ok()
|
2021-03-26 22:30:38 +00:00
|
|
|
}
|