|
|
@ -1,55 +1,24 @@ |
|
|
|
use serde::{Serialize, Deserialize}; |
|
|
|
|
|
|
|
use rocket_contrib::json::Json; |
|
|
|
use rocket::Response; |
|
|
|
use rocket::{Response, State}; |
|
|
|
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; |
|
|
|
|
|
|
|
use crate::config::Config; |
|
|
|
use crate::DbConn; |
|
|
|
use crate::models::errors::ErrorResponse; |
|
|
|
use crate::models::users::{LocalUser, CreateUserRequest}; |
|
|
|
use crate::models::errors::{ErrorResponse, make_500}; |
|
|
|
use crate::models::users::{LocalUser, CreateUserRequest, AuthClaims, AuthTokenRequest, AuthTokenResponse}; |
|
|
|
|
|
|
|
#[derive(Debug, Serialize, Deserialize)] |
|
|
|
struct AuthClaims { |
|
|
|
jti: String, |
|
|
|
sub: String, |
|
|
|
#[serde(with = "ts_seconds")] |
|
|
|
exp: DateTime<Utc>, |
|
|
|
#[serde(with = "ts_seconds")] |
|
|
|
iat: DateTime<Utc>, |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Debug, Serialize)] |
|
|
|
pub struct AuthTokenResponse { |
|
|
|
token: String |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Debug, Deserialize)] |
|
|
|
pub struct AuthTokenRequest { |
|
|
|
username: String, |
|
|
|
password: String, |
|
|
|
} |
|
|
|
|
|
|
|
#[post("/users/me/token", data = "<auth_request>")] |
|
|
|
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); |
|
|
|
pub fn create_auth_token( |
|
|
|
conn: DbConn, |
|
|
|
config: State<Config>, |
|
|
|
auth_request: Json<AuthTokenRequest> |
|
|
|
) -> Result<Json<AuthTokenResponse>, ErrorResponse<()>> { |
|
|
|
|
|
|
|
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(); |
|
|
|
let user_info = LocalUser::get_user_by_creds(&conn, &auth_request.username, &auth_request.password)?; |
|
|
|
let token = AuthClaims::new(&user_info, config.web_app.token_duration) |
|
|
|
.encode(&config.web_app.secret) |
|
|
|
.map_err(|e| make_500(e))?; |
|
|
|
|
|
|
|
Ok(Json(AuthTokenResponse { token })) |
|
|
|
} |
|
|
|