Skip to content

Commit f8c15f2

Browse files
authored
Google access token (#30)
For google authorization token can be accepted via header in GET request, if token is not found there user will be redirected to manual authorization as before
1 parent b0d8e12 commit f8c15f2

3 files changed

Lines changed: 54 additions & 10 deletions

File tree

src/endpoints.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use axum::{
88
Json,
99
};
1010
use futures::future::join_all;
11+
use http::HeaderMap;
1112
use indexmap::IndexMap;
1213
use serde::Serialize;
1314
use tower_sessions::Session;
@@ -193,11 +194,18 @@ pub struct Region {
193194

194195
pub async fn get_region(
195196
session: Session,
197+
headers: HeaderMap,
196198
State(server_state): State<ServerState>,
197199
OriginalUri(original_uri): OriginalUri,
198200
Path(github_login): Path<String>,
199201
) -> Result<Json<Region>, Error> {
200-
let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?;
202+
let sheets_client = sheets_client(
203+
&session,
204+
server_state.clone(),
205+
headers,
206+
original_uri.clone(),
207+
)
208+
.await?;
201209
let trainees = get_trainees(
202210
sheets_client,
203211
&server_state.config.github_email_mapping_sheet_id,
@@ -222,11 +230,18 @@ pub struct AttendanceResponse {
222230

223231
pub async fn fetch_attendance(
224232
session: Session,
233+
headers: HeaderMap,
225234
State(server_state): State<ServerState>,
226235
OriginalUri(original_uri): OriginalUri,
227236
) -> Result<Json<AttendanceResponse>, Error> {
228237
let all_courses = &server_state.config.courses;
229-
let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?;
238+
let sheets_client = sheets_client(
239+
&session,
240+
server_state.clone(),
241+
headers,
242+
original_uri.clone(),
243+
)
244+
.await?;
230245

231246
let mut courses: CourseAttendance = BTreeMap::new();
232247
let mut register_futures = Vec::new();

src/frontend.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use axum::{
77
response::{Html, IntoResponse, Response},
88
};
99
use futures::future::join_all;
10-
use http::{header::CONTENT_TYPE, StatusCode, Uri};
10+
use http::{header::CONTENT_TYPE, HeaderMap, StatusCode, Uri};
1111
use serde::Deserialize;
1212
use tower_sessions::Session;
1313

@@ -95,11 +95,18 @@ struct CourseScheduleWithBatchMetadata {
9595

9696
pub async fn get_trainee_batch(
9797
session: Session,
98+
headers: HeaderMap,
9899
State(server_state): State<ServerState>,
99100
OriginalUri(original_uri): OriginalUri,
100101
Path((course, batch_github_slug)): Path<(String, String)>,
101102
) -> Result<Html<String>, Error> {
102-
let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?;
103+
let sheets_client = sheets_client(
104+
&session,
105+
server_state.clone(),
106+
headers,
107+
original_uri.clone(),
108+
)
109+
.await?;
103110
let github_org = &server_state.config.github_org;
104111
let course_schedule = server_state
105112
.config
@@ -182,11 +189,18 @@ impl TraineeBatchTemplate {
182189

183190
pub async fn get_reviewers(
184191
session: Session,
192+
headers: HeaderMap,
185193
State(server_state): State<ServerState>,
186194
OriginalUri(original_uri): OriginalUri,
187195
Path(course): Path<String>,
188196
) -> Result<Html<String>, Error> {
189-
let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?;
197+
let sheets_client = sheets_client(
198+
&session,
199+
server_state.clone(),
200+
headers,
201+
original_uri.clone(),
202+
)
203+
.await?;
190204
let mut is_staff = true;
191205
let mut staff_details = get_reviewer_staff_info(
192206
sheets_client,

src/sheets.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use anyhow::Context;
2-
use http::Uri;
2+
use http::{HeaderMap, Uri};
33
use sheets::{spreadsheets::Spreadsheets, types::CellData};
44
use tower_sessions::Session;
55

@@ -35,12 +35,27 @@ pub(crate) fn cell_date(cell: &CellData) -> Result<chrono::NaiveDate, anyhow::Er
3535
pub(crate) async fn sheets_client(
3636
session: &Session,
3737
server_state: ServerState,
38+
headers: HeaderMap,
3839
original_uri: Uri,
3940
) -> Result<SheetsClient, Error> {
40-
let maybe_token: Option<String> = session
41-
.get(GoogleScope::Sheets.token_session_key())
42-
.await
43-
.context("Session load error")?;
41+
const AUTHORIZATION_HEADER: &str = "x-authorization-google";
42+
let maybe_token = if let Some(auth_header) = headers.get(AUTHORIZATION_HEADER) {
43+
let token = match auth_header.to_str() {
44+
Ok(s) => Some(s.to_string()),
45+
Err(e) => {
46+
return Err(Error::UserFacing(format!(
47+
"Invalid {} header: {}",
48+
AUTHORIZATION_HEADER, e
49+
)))
50+
}
51+
};
52+
token
53+
} else {
54+
session
55+
.get(GoogleScope::Sheets.token_session_key())
56+
.await
57+
.context("Session load error")?
58+
};
4459

4560
let redirect_endpoint = redirect_endpoint(&server_state);
4661

0 commit comments

Comments
 (0)