-
Notifications
You must be signed in to change notification settings - Fork 1.6k
implementing regionalized auth and exchangeToken #14865
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: byociam
Are you sure you want to change the base?
Conversation
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback. |
Generated by 🚫 Danger |
} | ||
|
||
/// Holds a Firebase ID token and its expiration. | ||
public struct AuthExchangeToken: Sendable { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we call it FirebaseToken instead? AuthExchange was name for a different project and I think we should avoid that name.
/// Holds a Firebase ID token and its expiration. | ||
public struct AuthExchangeToken: Sendable { | ||
public let token: String | ||
public let expirationDate: Date? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this optional?
// public static func auth(app: FirebaseApp, tenantConfig: nil) -> Auth { | ||
// let auth = auth(app: app) | ||
// return auth | ||
// } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need this commented code?
/// R-GCIP region, set once during Auth init. | ||
var location: String? | ||
|
||
/// R-GCIP tenantId, set once during Auth init. | ||
var tenantId: String? | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Any reason we are setting this separately? Why can't we have tenantConfig here?
apiProtocol = kHttpProtocol | ||
apiHostAndPathPrefix = "\(emulatorHostAndPort)/\(kRegionalGCIPAPIHost)" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we support this new endpoint in the emulator? If not, shouldn't we throw exception here saying not supported? IIUC, for this to work, we need the new identityplatform's api supported on the emulator, let me know if this is something else.
|
||
import Foundation | ||
|
||
private let kCustomTokenKey = "customToken" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is the significance of this? And why are we using customToken as the name here, probably we should use exchangeToken
instead
"exchangeOidcToken requires `auth.location` & `auth.tenantID`" | ||
) | ||
} | ||
_ = "\(region)-identityplatform.googleapis.com" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Let us use the location term instead of region as region has different meaning.
_ = "\(region)-identityplatform.googleapis.com" | ||
return "/v2alpha/projects/\(project)/locations/\(region)" + | ||
"/tenants/\(tenant)/idpConfigs/\(idpConfigID):exchangeOidcToken" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For prod-global
we will not have (region)-identityplatform
, instead it will be just identityplatform
. Please add a special check for that.
Feature: Implement Firebase Token Exchange with Tenant Configuration
Description
This PR introduces a new API for exchanging tokens with Firebase, supporting multi-tenancy through a
TenantConfig
struct. Key changes include:Auth
class:auth(app: FirebaseApp, tenantConfig: TenantConfig)
to create anAuth
instance with a specific tenant configuration.exchangeToken
function:async
functionexchangeToken(_ idToken: String, idpConfigId: String)
to handle token exchange asynchronously.TenantConfig
struct:location
andtenantId
.AuthExchangeToken
struct:API Changes
Auth
class with static methodauth(app: FirebaseApp, tenantConfig: TenantConfig) -> Auth
.exchangeToken
function:func exchangeToken( idToken: String, idpConfigId: String) async throws -> AuthExchangeToken
.TenantConfig
struct.AuthExchangeToken
struct.