backend: jwt token
This commit is contained in:
parent
52d59fe51b
commit
77abf8811a
3 changed files with 39 additions and 6 deletions
26
crates/backend/src/auth.rs
Normal file
26
crates/backend/src/auth.rs
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
use jsonwebtoken::{EncodingKey, Header, Validation};
|
||||||
|
use migration::token;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize)]
|
||||||
|
struct Claims {
|
||||||
|
sub: Uuid,
|
||||||
|
name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_jwt(
|
||||||
|
user: entity::user::Model,
|
||||||
|
key: &EncodingKey,
|
||||||
|
) -> Result<String, jsonwebtoken::errors::Error> {
|
||||||
|
let claims = Claims {
|
||||||
|
sub: user.id,
|
||||||
|
name: user.name,
|
||||||
|
};
|
||||||
|
jsonwebtoken::encode(&Header::default(), &claims, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn verify(token: &str) {
|
||||||
|
let validation = Validation::new(jsonwebtoken::Algorithm::HS256);
|
||||||
|
// jsonwebtoken::decode(token, , validation)
|
||||||
|
}
|
|
@ -1,14 +1,12 @@
|
||||||
use actix_web::{
|
use actix_web::{
|
||||||
error::{ErrorBadRequest, ErrorInternalServerError},
|
error::{ErrorBadRequest, ErrorInternalServerError},
|
||||||
web, Responder,
|
web, HttpResponse, Responder,
|
||||||
};
|
};
|
||||||
use argon2::{Argon2, PasswordHash, PasswordVerifier};
|
use argon2::{Argon2, PasswordHash, PasswordVerifier};
|
||||||
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
|
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
|
||||||
use crate::AppState;
|
use crate::{auth::create_jwt, AppState};
|
||||||
|
|
||||||
use super::user::UserWithoutPassword;
|
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
pub struct LoginRequest {
|
pub struct LoginRequest {
|
||||||
|
@ -24,6 +22,7 @@ impl AuthController {
|
||||||
login: web::Json<LoginRequest>,
|
login: web::Json<LoginRequest>,
|
||||||
) -> actix_web::Result<impl Responder> {
|
) -> actix_web::Result<impl Responder> {
|
||||||
let db = &state.db;
|
let db = &state.db;
|
||||||
|
let jwt_secret = &state.secret;
|
||||||
let login = login.into_inner();
|
let login = login.into_inner();
|
||||||
|
|
||||||
let user = entity::user::Entity::find()
|
let user = entity::user::Entity::find()
|
||||||
|
@ -39,6 +38,7 @@ impl AuthController {
|
||||||
.verify_password(login.password.as_bytes(), &parsed_hash)
|
.verify_password(login.password.as_bytes(), &parsed_hash)
|
||||||
.map_err(ErrorBadRequest)?;
|
.map_err(ErrorBadRequest)?;
|
||||||
|
|
||||||
Ok(web::Json(UserWithoutPassword::from(user)))
|
let jwt = create_jwt(user, jwt_secret).map_err(ErrorInternalServerError)?;
|
||||||
|
Ok(HttpResponse::Ok().body(jwt))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,18 @@
|
||||||
use actix_web::{web, App, HttpServer};
|
use actix_web::{web, App, HttpServer};
|
||||||
|
use jsonwebtoken::EncodingKey;
|
||||||
use migration::MigratorTrait;
|
use migration::MigratorTrait;
|
||||||
use sea_orm::{Database, DatabaseConnection};
|
use sea_orm::{Database, DatabaseConnection};
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
use routes::config;
|
use routes::config;
|
||||||
|
mod auth;
|
||||||
mod controller;
|
mod controller;
|
||||||
mod routes;
|
mod routes;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct AppState {
|
struct AppState {
|
||||||
db: DatabaseConnection,
|
db: DatabaseConnection,
|
||||||
|
secret: EncodingKey,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_web::main]
|
#[actix_web::main]
|
||||||
|
@ -20,6 +23,7 @@ async fn main() -> std::io::Result<()> {
|
||||||
dotenvy::dotenv().ok();
|
dotenvy::dotenv().ok();
|
||||||
|
|
||||||
let db_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
|
let db_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
|
||||||
|
let jwt_secret = env::var("TOKEN_SECRET").expect("TOKEN_SECRET must be set");
|
||||||
|
|
||||||
let conn = Database::connect(&db_url)
|
let conn = Database::connect(&db_url)
|
||||||
.await
|
.await
|
||||||
|
@ -31,7 +35,10 @@ async fn main() -> std::io::Result<()> {
|
||||||
.expect("Running migrations failed");
|
.expect("Running migrations failed");
|
||||||
println!("Finished running migrations");
|
println!("Finished running migrations");
|
||||||
|
|
||||||
let state = AppState { db: conn };
|
let state = AppState {
|
||||||
|
db: conn,
|
||||||
|
secret: EncodingKey::from_secret(jwt_secret.as_bytes()),
|
||||||
|
};
|
||||||
|
|
||||||
println!("Listening for connections...");
|
println!("Listening for connections...");
|
||||||
HttpServer::new(move || {
|
HttpServer::new(move || {
|
||||||
|
|
Loading…
Add table
Reference in a new issue