Skip to content

Commit f7e6ea9

Browse files
committed
fix(auth): simplify auth extractor
1 parent 640edf3 commit f7e6ea9

File tree

1 file changed

+40
-46
lines changed

1 file changed

+40
-46
lines changed

src/extractors/auth.rs

+40-46
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::pin::Pin;
22

3+
use actix_web::http::header::HeaderMap;
34
use actix_web::{web, FromRequest, HttpRequest};
45
use futures::Future;
56
use uuid::Uuid;
@@ -41,68 +42,44 @@ impl FromRequest for Auth {
4142
let data = req.app_data::<web::Data<AppData>>().unwrap().clone();
4243
let headers = req.headers().clone();
4344
Box::pin(async move {
44-
let token = match headers.get("Authorization") {
45+
let token = match parse_token(&headers) {
46+
Some(t) => t,
4547
None => {
4648
return Ok(Auth {
4749
developer: None,
4850
token: None,
49-
})
51+
});
5052
}
51-
Some(t) => match t.to_str() {
52-
Err(e) => {
53-
log::error!("Failed to parse auth token: {}", e);
54-
return Ok(Auth {
55-
developer: None,
56-
token: None,
57-
});
58-
}
59-
Ok(str) => {
60-
let split = str.split(' ').collect::<Vec<&str>>();
61-
if split.len() != 2 || split[0] != "Bearer" {
62-
return Ok(Auth {
63-
developer: None,
64-
token: None,
65-
});
66-
}
67-
match Uuid::try_parse(split[1]) {
68-
Err(e) => {
69-
log::error!("Failed to parse auth token {}, error: {}", str, e);
70-
return Ok(Auth {
71-
developer: None,
72-
token: None,
73-
});
74-
}
75-
Ok(token) => token,
76-
}
77-
}
78-
},
7953
};
8054

8155
let mut pool = data.db.acquire().await.or(Err(ApiError::DbAcquireError))?;
8256
let hash = sha256::digest(token.to_string());
83-
let developer = sqlx::query_as!(
57+
let developer = match sqlx::query_as!(
8458
FetchedDeveloper,
85-
"SELECT d.id, d.username, d.display_name, d.verified, d.admin FROM developers d
59+
"SELECT
60+
d.id,
61+
d.username,
62+
d.display_name,
63+
d.verified,
64+
d.admin
65+
FROM developers d
8666
INNER JOIN auth_tokens a ON d.id = a.developer_id
8767
WHERE a.token = $1",
8868
hash
8969
)
9070
.fetch_optional(&mut *pool)
91-
.await;
92-
let developer = match developer {
93-
Err(e) => {
94-
log::error!("{}", e);
95-
return Err(ApiError::DbError);
71+
.await
72+
.map_err(|e| {
73+
log::error!("Failed to lookup developer for auth: {}", e);
74+
ApiError::DbError
75+
})? {
76+
None => {
77+
return Ok(Auth {
78+
developer: None,
79+
token: None,
80+
})
9681
}
97-
Ok(d) => match d {
98-
None => {
99-
return Ok(Auth {
100-
developer: None,
101-
token: None,
102-
})
103-
}
104-
Some(data) => data,
105-
},
82+
Some(d) => d,
10683
};
10784

10885
Ok(Auth {
@@ -112,3 +89,20 @@ impl FromRequest for Auth {
11289
})
11390
}
11491
}
92+
93+
fn parse_token(map: &HeaderMap) -> Option<Uuid> {
94+
map.get("Authorization")
95+
.map(|header| header.to_str().ok())
96+
.flatten()
97+
.map(|str| -> Option<&str> {
98+
let split = str.split(' ').collect::<Vec<&str>>();
99+
if split.len() != 2 || split[0] != "Bearer" {
100+
None
101+
} else {
102+
Some[1]
103+
}
104+
})
105+
.flatten()
106+
.map(|str| Uuid::try_parse(str).ok())
107+
.flatten()
108+
}

0 commit comments

Comments
 (0)