Add example protected route to project
This commit is contained in:
parent
1e83393ad6
commit
fb5aa5ee5a
9 changed files with 161 additions and 36 deletions
|
@ -1,34 +1,13 @@
|
|||
use crate::{
|
||||
db_connection::DbPool,
|
||||
errors::CustomError,
|
||||
handlers::logged_user::LoggedUser,
|
||||
handlers::pool_handler,
|
||||
models::user::{AuthUser, DeleteUser, RegisterUser, User},
|
||||
utils::jwt::{decode_token, encode_token, UserWithToken},
|
||||
utils::jwt::encode_token,
|
||||
};
|
||||
use actix_identity::Identity;
|
||||
use actix_web::{dev::Payload, web, FromRequest, HttpRequest, HttpResponse};
|
||||
use futures::future::Future;
|
||||
use std::pin::Pin;
|
||||
|
||||
pub type LoggedUser = UserWithToken;
|
||||
|
||||
impl FromRequest for LoggedUser {
|
||||
type Error = HttpResponse;
|
||||
type Config = ();
|
||||
type Future = Pin<Box<dyn Future<Output = Result<UserWithToken, HttpResponse>>>>;
|
||||
|
||||
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future {
|
||||
let fut = Identity::from_request(req, payload);
|
||||
|
||||
Box::pin(async move {
|
||||
if let Some(identity) = fut.await?.identity() {
|
||||
let user = decode_token(&identity)?;
|
||||
return Ok(user);
|
||||
};
|
||||
Err(HttpResponse::Unauthorized().finish())
|
||||
})
|
||||
}
|
||||
}
|
||||
use actix_web::{web, HttpResponse};
|
||||
|
||||
pub async fn register(
|
||||
new_user: web::Json<RegisterUser>,
|
||||
|
|
25
project/backend/src/handlers/logged_user.rs
Normal file
25
project/backend/src/handlers/logged_user.rs
Normal file
|
@ -0,0 +1,25 @@
|
|||
use crate::utils::jwt::{decode_token, UserWithToken};
|
||||
use actix_identity::Identity;
|
||||
use actix_web::{dev::Payload, FromRequest, HttpRequest, HttpResponse};
|
||||
use futures::future::Future;
|
||||
use std::pin::Pin;
|
||||
|
||||
pub type LoggedUser = UserWithToken;
|
||||
|
||||
impl FromRequest for LoggedUser {
|
||||
type Error = HttpResponse;
|
||||
type Config = ();
|
||||
type Future = Pin<Box<dyn Future<Output = Result<UserWithToken, HttpResponse>>>>;
|
||||
|
||||
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future {
|
||||
let fut = Identity::from_request(req, payload);
|
||||
|
||||
Box::pin(async move {
|
||||
if let Some(identity) = fut.await?.identity() {
|
||||
let user = decode_token(&identity)?;
|
||||
return Ok(user);
|
||||
};
|
||||
Err(HttpResponse::Unauthorized().finish())
|
||||
})
|
||||
}
|
||||
}
|
|
@ -2,6 +2,8 @@ use crate::db_connection::{DbPool, MyPooledConnection};
|
|||
use actix_web::{web, HttpResponse};
|
||||
|
||||
pub mod authentication;
|
||||
pub mod logged_user;
|
||||
pub mod protected;
|
||||
|
||||
pub fn pool_handler(pool: web::Data<DbPool>) -> Result<MyPooledConnection, HttpResponse> {
|
||||
pool.get()
|
||||
|
|
14
project/backend/src/handlers/protected.rs
Normal file
14
project/backend/src/handlers/protected.rs
Normal file
|
@ -0,0 +1,14 @@
|
|||
use crate::handlers::logged_user::LoggedUser;
|
||||
use actix_web::HttpResponse;
|
||||
use serde::Serialize;
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct SuccessMessage {
|
||||
message: String,
|
||||
}
|
||||
|
||||
pub async fn protected_route(_user: LoggedUser) -> Result<HttpResponse, HttpResponse> {
|
||||
Ok(HttpResponse::Ok().json(SuccessMessage {
|
||||
message: String::from("Tämä on suojattu viesti palvelimelta"),
|
||||
}))
|
||||
}
|
|
@ -22,7 +22,7 @@ use actix_web::{
|
|||
use chrono::Duration;
|
||||
use db_connection::get_pool;
|
||||
use dotenv::dotenv;
|
||||
use handlers::authentication;
|
||||
use handlers::{authentication, protected};
|
||||
|
||||
pub fn get_env(var_name: &str) -> String {
|
||||
match std::env::var(&var_name) {
|
||||
|
@ -96,6 +96,7 @@ async fn main() -> std::io::Result<()> {
|
|||
.service(resource("/logout").route(post().to(authentication::logout)))
|
||||
.service(resource("/delete").route(delete().to(authentication::delete))),
|
||||
)
|
||||
.service(resource("/api/protected").route(get().to(protected::protected_route)))
|
||||
.service(api_404_unconfigured)
|
||||
.service(Files::new("/", "./static").index_file("index.html"))
|
||||
.default_service(get().to(serve_index_html))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue