#firebase #rocket #jwt #codec #service-account #firebase-auth

rocket_firebase_auth

Encode/decode firebase tokens in rocket apps with ease

12 unstable releases (4 breaking)

0.5.0 Mar 11, 2024
0.4.0 Aug 19, 2023
0.3.3 Mar 26, 2023
0.3.1 Jan 24, 2023
0.1.1 Oct 29, 2022

#223 in Authentication

MIT license

34KB
507 lines

rocket-firebase-auth

status crate codecov

Firebase Auth with Rocket, batteries included

  • Tiny: rocket-firebase-auth is tiny, with features allowing you to make it even tinier
  • Does one thing well: Encodes/decodes Firebase JWT tokens in Rocket apps, and that's it

Getting started

1. Set Firebase service account keys as env variables

If you haven't already, create a service account in Firebase for the Rocket backend you are creating. Generate a new private key and copy-paste the generated json into a firebase-credentials.json file. It should look something like the json snippet below.

{
  "type": "*********",
  "project_id": "***********",
  "private_key_id": "*************",
  "private_key": "*****************",
  "client_email": "*********",
  "client_id": "*******",
  "auth_uri": "********",
  "token_uri": "********",
  "auth_provider_x509_cert_url": "********",
  "client_x509_cert_url": "********"
}

Don't forget to add the firebase-credentials.json file to your .gitignore.

# Firebase service account's secret credentials
firebase-credentials.json

2. Setup FirebaseAuth and get started

Add rocket-firebase-auth to your project.

rocket_firebase_auth = "0.5"

Now, you can create a FirebaseAuth struct by reading the json file with a helper function included with the default import.

use rocket::{get, http::Status, routes, Build, Rocket};
use rocket_firebase_auth::{FirebaseAuth, FirebaseToken};

// Setup the server state, which will include your FirebaseAuth instance, among
// other things like the connection pool to your database.
struct ServerState {
    auth: FirebaseAuth,
}

#[get("/")]
async fn hello_world(token: FirebaseToken) -> Status {
    println!("Authentication succeeded with uid={}", token.sub);
    Status::Ok
}

#[rocket::launch]
async fn rocket() -> Rocket<Build> {
    let firebase_auth = FirebaseAuth::builder()
        .json_file("firebase-credentials.json")
        .build()
        .unwrap();

    rocket::build()
        .mount("/", routes![hello_world])
        .manage(ServerState {
            auth: firebase_auth,
        })
}

Example projects

For a more detailed example with a frontend example as well, checkout the example projects .

Testing

To run tests, run the following command:

cargo test -- --test-threads=1

Contribute

Any contributions (PRs, Issues) are welcomed!

Questions

If you have any questions, however trivial it may seem, please let me know via Issues. I will respond!

License

MIT

Dependencies

~18–53MB
~1M SLoC