Description
Description
In FirebaseAuth/Sources/Swift/ActionCode/ActionCodeInfo.swift
, the method actionCodeOperation(forRequestType:)
uses all-uppercase string literals (e.g. "PASSWORD_RESET"
, "VERIFY_EMAIL"
) to match against the request type string received from the server.
However, Firebase uses camelCase for the mode
parameter in action links, as documented here:
https://firebase.google.com/docs/auth/custom-email-handler#create_the_email_action_handler_page
Because of this mismatch, the method always returns .unknown
.
Code Reference
class func actionCodeOperation(forRequestType requestType: String?) -> ActionCodeOperation {
switch requestType {
case "PASSWORD_RESET": return .passwordReset
case "VERIFY_EMAIL": return .verifyEmail
case "RECOVER_EMAIL": return .recoverEmail
case "EMAIL_SIGNIN": return .emailLink
case "VERIFY_AND_CHANGE_EMAIL": return .verifyAndChangeEmail
case "REVERT_SECOND_FACTOR_ADDITION": return .revertSecondFactorAddition
default: return .unknown
}
}
Suggested Fix
Update the switch statement to use camelCase keys to match the values provided by Firebase in the mode parameter.
switch requestType {
case "resetPassword": return .passwordReset
case "verifyEmail": return .verifyEmail
case "recoverEmail": return .recoverEmail
case "signIn": return .emailLink
case "verifyAndChangeEmail": return .verifyAndChangeEmail
case "revertSecondFactorAddition": return .revertSecondFactorAddition
default: return .unknown
}
Reproducing the issue
- Trigger any Firebase action that sends an email with an action link (e.g., password reset).
- Open the link and inspect the mode parameter – it will be camelCase (e.g., mode=resetPassword).
- When passed to ActionCodeURL, the internal mapping in ActionCodeInfo returns .unknown.
Expected behavior:
ActionCodeOperation
should correctly reflect the action specified in the mode parameter.
Actual behavior:
ActionCodeOperation == .unknown
Firebase SDK Version
11.11.0
Xcode Version
16.3
Installation Method
Swift Package Manager
Firebase Product(s)
Authentication
Targeted Platforms
All
Relevant Log Output
If using Swift Package Manager, the project's Package.resolved
Expand Package.resolved
snippet
Replace this line with the contents of your Package.resolved.
If using CocoaPods, the project's Podfile.lock
Expand Podfile.lock
snippet
Replace this line with the contents of your Podfile.lock!