Add example protected route to project

This commit is contained in:
Marko Korhonen 2020-05-08 09:35:28 +03:00
parent 1e83393ad6
commit fb5aa5ee5a
No known key found for this signature in database
GPG key ID: 911B85FBC6003FE5
9 changed files with 161 additions and 36 deletions

View file

@ -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>,

View 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())
})
}
}

View file

@ -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()

View 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"),
}))
}

View file

@ -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))