Skip to content

Commit 0f2c22d

Browse files
David Graeffdavidgraeff
David Graeff
authored andcommitted
Examples: Move shared functions into utils module
Signed-off-by: David Graeff <[email protected]>
1 parent 4060212 commit 0f2c22d

File tree

2 files changed

+82
-60
lines changed

2 files changed

+82
-60
lines changed

examples/create_read_write_document.rs

Lines changed: 7 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
use firestore_db_and_auth::{
2-
documents, dto, errors, sessions, Credentials, FirebaseAuthBearer, JWKSet, ServiceSession,
3-
};
1+
use firestore_db_and_auth::{documents, dto, errors, sessions, Credentials, FirebaseAuthBearer, ServiceSession};
42

53
use firestore_db_and_auth::documents::WriteResult;
6-
use firestore_db_and_auth::jwt::download_google_jwks;
74
use serde::{Deserialize, Serialize};
85

9-
const TEST_USER_ID: &str = include_str!("test_user_id.txt");
6+
mod utils;
107

118
#[derive(Debug, Serialize, Deserialize)]
129
struct DemoDTO {
@@ -93,43 +90,16 @@ fn service_account_session(cred: Credentials) -> errors::Result<()> {
9390
Ok(())
9491
}
9592

96-
fn user_session_with_cached_refresh_token(cred: &Credentials) -> errors::Result<sessions::user::Session> {
97-
println!("Refresh token from file");
98-
// Read refresh token from file if possible instead of generating a new refresh token each time
99-
let refresh_token: String = match std::fs::read_to_string("refresh-token-for-tests.txt") {
100-
Ok(v) => v,
101-
Err(e) => {
102-
if e.kind() != std::io::ErrorKind::NotFound {
103-
return Err(errors::FirebaseError::IO(e));
104-
}
105-
String::new()
106-
}
107-
};
108-
109-
// Generate a new refresh token if necessary
110-
println!("Generate new user auth token");
111-
let user_session: sessions::user::Session = if refresh_token.is_empty() {
112-
let session = sessions::user::Session::by_user_id(&cred, TEST_USER_ID, true)?;
113-
std::fs::write("refresh-token-for-tests.txt", &session.refresh_token.as_ref().unwrap())?;
114-
session
115-
} else {
116-
println!("user::Session::by_refresh_token");
117-
sessions::user::Session::by_refresh_token(&cred, &refresh_token)?
118-
};
119-
120-
Ok(user_session)
121-
}
122-
12393
fn user_account_session(cred: Credentials) -> errors::Result<()> {
124-
let user_session = user_session_with_cached_refresh_token(&cred)?;
94+
let user_session = utils::user_session_with_cached_refresh_token(&cred)?;
12595

126-
assert_eq!(user_session.user_id, TEST_USER_ID);
96+
assert_eq!(user_session.user_id, utils::TEST_USER_ID);
12797
assert_eq!(user_session.project_id(), cred.project_id);
12898

12999
println!("user::Session::by_access_token");
130100
let user_session = sessions::user::Session::by_access_token(&cred, &user_session.access_token_unchecked())?;
131101

132-
assert_eq!(user_session.user_id, TEST_USER_ID);
102+
assert_eq!(user_session.user_id, utils::TEST_USER_ID);
133103

134104
let obj = DemoDTO {
135105
a_string: "abc".to_owned(),
@@ -213,29 +183,6 @@ fn user_account_session(cred: Credentials) -> errors::Result<()> {
213183
Ok(())
214184
}
215185

216-
/// Download the two public key JWKS files if necessary and cache the content at the given file path.
217-
/// Only use this option in cloud functions if the given file path is persistent.
218-
/// You can use [`Credentials::add_jwks_public_keys`] to manually add more public keys later on.
219-
pub fn from_cache_file(cache_file: &std::path::Path, c: &Credentials) -> errors::Result<JWKSet> {
220-
use std::fs::File;
221-
use std::io::BufReader;
222-
223-
Ok(if cache_file.exists() {
224-
let f = BufReader::new(File::open(cache_file)?);
225-
let jwks_set: JWKSet = serde_json::from_reader(f)?;
226-
jwks_set
227-
} else {
228-
// If not present, download the two jwks (specific service account + google system account),
229-
// merge them into one set of keys and store them in the cache file.
230-
let mut jwks = JWKSet::new(&download_google_jwks(&c.client_email)?)?;
231-
jwks.keys
232-
.append(&mut JWKSet::new(&download_google_jwks("[email protected]")?)?.keys);
233-
let f = File::create(cache_file)?;
234-
serde_json::to_writer_pretty(f, &jwks)?;
235-
jwks
236-
})
237-
}
238-
239186
fn main() -> errors::Result<()> {
240187
// Search for a credentials file in the root directory
241188
use std::path::PathBuf;
@@ -244,7 +191,7 @@ fn main() -> errors::Result<()> {
244191
let mut cred = Credentials::from_file(credential_file.to_str().unwrap())?;
245192

246193
// Only download the public keys once, and cache them.
247-
let jwkset = from_cache_file(credential_file.with_file_name("cached_jwks.jwks").as_path(), &cred)?;
194+
let jwkset = utils::from_cache_file(credential_file.with_file_name("cached_jwks.jwks").as_path(), &cred)?;
248195
cred.add_jwks_public_keys(&jwkset);
249196
cred.verify()?;
250197

@@ -268,7 +215,7 @@ fn valid_test_credentials() -> errors::Result<Credentials> {
268215
let mut cred: Credentials = Credentials::new(include_str!("../firebase-service-account.json"))?;
269216

270217
// Only download the public keys once, and cache them.
271-
let jwkset = from_cache_file(jwks_path.as_path(), &cred)?;
218+
let jwkset = utils::from_cache_file(jwks_path.as_path(), &cred)?;
272219
cred.add_jwks_public_keys(&jwkset);
273220
cred.verify()?;
274221

examples/utils/mod.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
use firestore_db_and_auth::{errors, sessions, Credentials, JWKSet};
2+
3+
use firestore_db_and_auth::jwt::download_google_jwks;
4+
5+
#[allow(dead_code)]
6+
pub const TEST_USER_ID: &str = include_str!("../test_user_id.txt");
7+
8+
pub fn user_session_with_cached_refresh_token(cred: &Credentials) -> errors::Result<sessions::user::Session> {
9+
println!("Refresh token from file");
10+
// Read refresh token from file if possible instead of generating a new refresh token each time
11+
let refresh_token: String = match std::fs::read_to_string("refresh-token-for-tests.txt") {
12+
Ok(v) => v,
13+
Err(e) => {
14+
if e.kind() != std::io::ErrorKind::NotFound {
15+
return Err(errors::FirebaseError::IO(e));
16+
}
17+
String::new()
18+
}
19+
};
20+
21+
// Generate a new refresh token if necessary
22+
println!("Generate new user auth token");
23+
let user_session: sessions::user::Session = if refresh_token.is_empty() {
24+
let session = sessions::user::Session::by_user_id(&cred, TEST_USER_ID, true)?;
25+
std::fs::write("refresh-token-for-tests.txt", &session.refresh_token.as_ref().unwrap())?;
26+
session
27+
} else {
28+
println!("user::Session::by_refresh_token");
29+
sessions::user::Session::by_refresh_token(&cred, &refresh_token)?
30+
};
31+
32+
Ok(user_session)
33+
}
34+
35+
/// Download the two public key JWKS files if necessary and cache the content at the given file path.
36+
/// Only use this option in cloud functions if the given file path is persistent.
37+
/// You can use [`Credentials::add_jwks_public_keys`] to manually add more public keys later on.
38+
pub fn from_cache_file(cache_file: &std::path::Path, c: &Credentials) -> errors::Result<JWKSet> {
39+
use std::fs::File;
40+
use std::io::BufReader;
41+
42+
Ok(if cache_file.exists() {
43+
let f = BufReader::new(File::open(cache_file)?);
44+
let jwks_set: JWKSet = serde_json::from_reader(f)?;
45+
jwks_set
46+
} else {
47+
// If not present, download the two jwks (specific service account + google system account),
48+
// merge them into one set of keys and store them in the cache file.
49+
let mut jwks = JWKSet::new(&download_google_jwks(&c.client_email)?)?;
50+
jwks.keys
51+
.append(&mut JWKSet::new(&download_google_jwks("[email protected]")?)?.keys);
52+
let f = File::create(cache_file)?;
53+
serde_json::to_writer_pretty(f, &jwks)?;
54+
jwks
55+
})
56+
}
57+
58+
/// For integration tests and doc code snippets: Create a Credentials instance.
59+
/// Necessary public jwk sets are downloaded or re-used if already present.
60+
#[cfg(test)]
61+
#[allow(dead_code)]
62+
pub fn valid_test_credentials() -> errors::Result<Credentials> {
63+
use std::path::PathBuf;
64+
let mut jwks_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
65+
jwks_path.push("firebase-service-account.jwks");
66+
67+
let mut cred: Credentials = Credentials::new(include_str!("../../firebase-service-account.json"))?;
68+
69+
// Only download the public keys once, and cache them.
70+
let jwkset = from_cache_file(jwks_path.as_path(), &cred)?;
71+
cred.add_jwks_public_keys(&jwkset);
72+
cred.verify()?;
73+
74+
Ok(cred)
75+
}

0 commit comments

Comments
 (0)