netdb_auth 0.2.0

Netdb Auth validation for rocket
Documentation
use netdb_auth::User;
use netdb_auth::has_scope;
use rocket::http::Status;
use rocket::{launch, routes, Build, Rocket};

#[macro_use] extern crate rocket;

#[has_scope("minesweeper")]
#[get("/")]
fn test1(user: User) -> Result<String, Status> {
    Ok(user.username.to_string())
}

#[has_scope("hub")]
#[get("/test2")]
fn test2(user: User) -> Result<String, Status> {
    Ok(user.username.to_string())
}

#[has_scope("hub", 1)]
#[get("/test3")]
fn test3(user: User) -> Result<String, Status> {
    Ok(user.username.to_string())
}

#[has_scope("hub", 100000000)]
#[get("/test4")]
async fn test4(user: User) -> Result<String, String> {
    //wait for 1 second
    tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;

    if 1 == 1 {
        return Ok(user.username.to_string());
    }

    Err(user.username.to_string())
}

#[launch]
fn rocket() -> Rocket<Build> {
    rocket::build().mount("/", routes![test1, test2, test3, test4])
}

#[cfg(test)]
mod tests {
    use std::env;
    use super::rocket;
    use rocket::local::blocking::Client;
    use rocket::http::{Header, Status}; 
    use rocket::uri;

    static TOKEN: &str = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImFkbWluIiwidHlwIjoiSldUIn0.eyJpc3MiOiJodHRwczovL2xvZ2luLm5ldGRiLmF0IiwiZXhwIjoxNzUzNTE5NDAwLCJpYXQiOjE3NTM1MTkxMDAsIm5iZiI6MTc1MzUxOTEwMCwic3ViIjoiMSIsInVzZXJuYW1lIjoiQXVlcm5pZyIsImF2YXRhciI6Imh0dHBzOi8vY2RuLm5ldGRiLmF0L2F2YXRhci8xYjZkZGE1ZDI5MDk0Mjc0YTQ0MWVmYTY4ZTkxMjlhZS5wbmciLCJsYW5nIjoiZGUtYXQiLCJzY29wZSI6Im1haWw6MiBmaWxlc2hhcmU6MTg0OSBvZmZsaW5lX2FjY2VzcyBhZG1pbiIsImF1ZCI6Imh0dHBzOi8vbmV0ZGIuYXQvIn0.KwgB_tRwiYcTcDFhStBst_LJprBL29CA7iOxn8kiXtFVrwwVy0iBAJUw0OHYCQdx5FFTmllgGI_T6lD4nt-r0_PQsw2dFsLDKGwoP9ggUgx1QG-hbaLri3LW9-e7XGCK4FKDj75RVqhWw8l7LTkOEGX-MuetxoURyAU1CFOz8LTJSOUUdYpPmZOi12uKg1vvfIuVu1yrm5lNkjMrhBCfBToFP3Q16NNvjTgmLZwIg5G0PtbcC6z5_f0JcA6XrBCRa19NIGKQ4LUDp93AoIwQjevBwuggtfE6ZUEKmpPo6MINWEJVMuBjaSU7853xOtAvr8ZyBFztcPld2Gh7eyfBH_R8BdoXRCsFxLBHi0uUHcRNfKYNPVpNWE1-Vlz9dYokBHQ0sxJ3SNBQqkQGv9yzHgYyk7YtIvOFdnjicjWcj05o35LwRSZTHW-cea2O-O6MZBUQg2sEcXqVazE46N7Qhu1a7hOFOkKx21PhUmc5tpdgRY2vQf6sHOgylRr5bo4ep-90u6oUYXTQYS5vESGQMLKwzL4wlcNbjTEXOgp9KOZ2M5GLqNHijaPXGRQXnu2uDHsFJm2Us45HAlyyE1oDA7ezD5s076asrb9N_ALZfexYroRDahDaqcnO0ubvzIucgc8HXAdGw8zbl7ECVRiPbeitNv4jadm5Gv82V3Wl4ro";

    #[test]
    fn test_unauth() {
        env::set_var("DOMAIN", "netdb.at");
        env::set_var("AUDIENCE", "https://netdb.at/");

        let client = Client::tracked(rocket()).expect("valid rocket instance");
        let response = client.get(uri!(crate::test1)).dispatch();
        assert_eq!(response.status(), Status::Unauthorized);
    }

    #[test]
    fn test_auth() {
        env::set_var("DOMAIN", "netdb.at");
        env::set_var("AUDIENCE", "https://netdb.at/");

        let client = Client::tracked(rocket()).expect("valid rocket instance");
        let response = client.get(uri!(crate::test1)).header(Header::new("Authorization", "Bearer ".to_owned() + TOKEN)).dispatch();
        assert_eq!(response.status(), Status::Forbidden);
    }

    #[test]
    fn test_auth_scope() {
        env::set_var("DOMAIN", "netdb.at");
        env::set_var("AUDIENCE", "https://netdb.at/");

        let client = Client::tracked(rocket()).expect("valid rocket instance");
        let response = client.get(uri!(crate::test2)).header(Header::new("Authorization", "Bearer ".to_owned() + TOKEN)).dispatch();
        assert_eq!(response.status(), Status::Ok);
    }

    #[test]
    fn test_auth_scope2() {
        env::set_var("DOMAIN", "netdb.at");
        env::set_var("AUDIENCE", "https://netdb.at/");

        let client = Client::tracked(rocket()).expect("valid rocket instance");
        let response = client.get(uri!(crate::test3)).header(Header::new("Authorization", "Bearer ".to_owned() + TOKEN)).dispatch();
        assert_eq!(response.status(), Status::Ok);
    }

    #[test]
    fn test_auth_scope3() {
        env::set_var("DOMAIN", "netdb.at");
        env::set_var("AUDIENCE", "https://netdb.at/");

        let client = Client::tracked(rocket()).expect("valid rocket instance");
        let response = client.get(uri!(crate::test4)).header(Header::new("Authorization", "Bearer ".to_owned() + TOKEN)).dispatch();
        assert_eq!(response.status(), Status::Ok);
        assert_eq!(response.into_string().unwrap(), "Forbidden".to_string());
    }
}