Repository navigation
Support web, Android and iOS apps per profile - #20
Merged
Merged
Conversation
6 tasks done
A profile now holds a list of the project's Firebase apps instead of one API key and App ID, and an App dropdown in the top bar picks the one the ID-token and App Check tabs use. Load apps imports every app in the project, with its API key, package name and SHA-1 or bundle ID, through the Firebase Management API; apps can also be added and edited by hand. Requests made with an Android or iOS app's key now send X-Android-Package and X-Android-Cert, or X-Ios-Bundle-Identifier, as the Firebase SDKs do, so keys restricted to that app are accepted. App names, IDs and platform identifiers are always saved; only API keys and debug tokens follow the remember checkbox, renamed to "remember API keys & debug tokens". Existing profiles migrate into a single app on first launch. The tab area now scrolls as a whole: with the taller top bar, the last rows of a long claims table were left below the window.
Clear all claims sent an empty customAttributes string, which the
Identity Toolkit API now rejects with "INVALID_CLAIMS : Not a JSON
Object: null". Send "{}" instead, as the Admin SDKs do, and show a user
whose claims are "{}" as having none.
A Save refused before reaching the API (invalid JSON, over 1,000 bytes)
also left the previous "Saved." message on screen beside the error.
Covers Load apps, adding apps by hand, the identity headers sent for Android and iOS keys, the renamed remember checkbox, and migration from 0.1.x. Screenshots and the quick-start recording are refreshed for the new top bar.
smaranjit
force-pushed
the
feat/multi-app
branch
from
October 6, 2026 20:07
30ddb91 to
9320237
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this change?
Multiple apps per profile.
API keys restricted to an app now work. An Android app's requests send
X-Android-PackageandX-Android-Cert, and an iOS app's sendX-Ios-Bundle-Identifier, alongside the key, as the Firebase SDKs do. Before, only the key was sent, so Google rejected any key with an app restriction.Persistence change:
Fixes found while testing:
INVALID_CLAIMS : Not a JSON Object: null. It sent an emptycustomAttributesstring, which the API now rejects; it now sends{}. This bug is in v0.1.6.Checklist
cargo fmt --all -- --checkpassescargo clippy --all-targets -- -D warningspassescargo test --all-targetspasses: 42 tests, up from 19, also run on Rust 1.90 under Ubuntu 22.04cargo build --releasesucceeds (Rust 1.90,--locked)CHANGELOG.mdupdated under[Unreleased], if user-facingNotes for the reviewer
Tested end to end in a sandboxed Ubuntu 22.04 desktop against the demo project, which has web, Android and iOS apps:
dev.ftt.demoplus its SHA-1, returns an ID token. With the SHA-1 cleared it fails withRequests from this Android client application dev.ftt.demo are blocked.Other notes:
ronis added as a dev-dependency for the migration tests. It's already in the tree through eframe's persistence feature.src/firebase/apps.rsexplains why. Tests cover a real plist shape.