Skip to content

feat(auth): Update ActionCodeSettings to support LinkDomain and deprecate DynamicLinkDomain #703

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

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
54b8114
Merge dev into master
google-oss-bot May 21, 2020
cef91ac
Merge dev into master
google-oss-bot Jun 16, 2020
77177c7
Merge dev into master
google-oss-bot Oct 22, 2020
a957589
Merge dev into master
google-oss-bot Jan 28, 2021
eb0d2a0
Merge dev into master
google-oss-bot Mar 24, 2021
05378ef
Merge dev into master
google-oss-bot Mar 29, 2021
4121c50
Merge dev into master
google-oss-bot Apr 14, 2021
928b104
Merge dev into master
google-oss-bot Jun 2, 2021
02cde4f
Merge dev into master
google-oss-bot Nov 4, 2021
6b40682
Merge dev into master
google-oss-bot Dec 15, 2021
e60757f
Merge dev into master
google-oss-bot Jan 20, 2022
bb055ed
Merge dev into master
google-oss-bot Apr 6, 2022
23a1f17
Merge dev into master
google-oss-bot Oct 6, 2022
1d24577
Merge dev into master
google-oss-bot Nov 10, 2022
61c6c04
Merge dev into master
google-oss-bot Apr 6, 2023
32af2b8
[chore] Release 4.12.0 (#561)
lahirumaramba Jun 22, 2023
02300a8
Revert "[chore] Release 4.12.0 (#561)" (#565)
lahirumaramba Jul 11, 2023
74c9bd5
Merge dev into master
google-oss-bot Jul 12, 2023
37c7936
Merge dev into master
google-oss-bot Sep 25, 2023
b04387e
Merge dev into master
google-oss-bot Nov 23, 2023
87b867c
Merge dev into master
google-oss-bot Apr 10, 2024
6a28190
Merge dev into master
google-oss-bot May 30, 2024
c3be6f2
Merge dev into master
google-oss-bot Oct 24, 2024
afeaa15
Merge dev into master
google-oss-bot Dec 5, 2024
570427a
Merge dev into master
google-oss-bot Feb 13, 2025
fe866a0
Merge dev into master
google-oss-bot Jun 5, 2025
db240e4
Merge dev into master
google-oss-bot Jun 11, 2025
5236150
Add LinkDomain to ActionCodeSettings
graeme-verticalscope Apr 9, 2025
0b7fc2c
Merge branch 'dev' into actioncodesettings-linkdomain-master
graeme-verticalscope Jul 8, 2025
a7de246
Handle INVALID_HOSTING_LINK_DOMAIN
graeme-verticalscope Jul 22, 2025
e384662
Mark DynamicLinkDomain as deprecated
graeme-verticalscope Jul 22, 2025
c0bc26f
Better error message for INVALID_HOSTING_LINK_DOMAIN
graeme-verticalscope Jul 23, 2025
cf4bee1
Merge branch 'dev' into actioncodesettings-linkdomain-master
graeme-verticalscope Jul 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion auth/email_action_links.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ type ActionCodeSettings struct {
AndroidPackageName string `json:"androidPackageName,omitempty"`
AndroidMinimumVersion string `json:"androidMinimumVersion,omitempty"`
AndroidInstallApp bool `json:"androidInstallApp,omitempty"`
DynamicLinkDomain string `json:"dynamicLinkDomain,omitempty"`
LinkDomain string `json:"linkDomain,omitempty"`
// Deprecated: Use LinkDomain instead.
DynamicLinkDomain string `json:"dynamicLinkDomain,omitempty"`
}

func (settings *ActionCodeSettings) toMap() (map[string]interface{}, error) {
Expand Down
3 changes: 3 additions & 0 deletions auth/email_action_links_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ var testActionLinkResponse = []byte(fmt.Sprintf(testActionLinkFormat, testAction
var testActionCodeSettings = &ActionCodeSettings{
URL: "https://example.dynamic.link",
HandleCodeInApp: true,
LinkDomain: "hosted.page.link",
DynamicLinkDomain: "custom.page.link",
IOSBundleID: "com.example.ios",
AndroidPackageName: "com.example.android",
Expand All @@ -44,6 +45,7 @@ var testActionCodeSettings = &ActionCodeSettings{
var testActionCodeSettingsMap = map[string]interface{}{
"continueUrl": "https://example.dynamic.link",
"canHandleCodeInApp": true,
"linkDomain": "hosted.page.link",
"dynamicLinkDomain": "custom.page.link",
"iOSBundleId": "com.example.ios",
"androidPackageName": "com.example.android",
Expand Down Expand Up @@ -293,6 +295,7 @@ func TestEmailVerificationLinkError(t *testing.T) {
cases := map[string]func(error) bool{
"UNAUTHORIZED_DOMAIN": IsUnauthorizedContinueURI,
"INVALID_DYNAMIC_LINK_DOMAIN": IsInvalidDynamicLinkDomain,
"INVALID_HOSTING_LINK_DOMAIN": IsInvalidHostingLinkDomain,
}
s := echoServer(testActionLinkResponse, t)
defer s.Close()
Expand Down
11 changes: 11 additions & 0 deletions auth/user_mgt.go
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,7 @@ const (
emailAlreadyExists = "EMAIL_ALREADY_EXISTS"
emailNotFound = "EMAIL_NOT_FOUND"
invalidDynamicLinkDomain = "INVALID_DYNAMIC_LINK_DOMAIN"
invalidHostingLinkDomain = "INVALID_HOSTING_LINK_DOMAIN"
phoneNumberAlreadyExists = "PHONE_NUMBER_ALREADY_EXISTS"
tenantNotFound = "TENANT_NOT_FOUND"
uidAlreadyExists = "UID_ALREADY_EXISTS"
Expand Down Expand Up @@ -556,6 +557,11 @@ func IsInvalidDynamicLinkDomain(err error) bool {
return hasAuthErrorCode(err, invalidDynamicLinkDomain)
}

// IsInvalidHostingLinkDomain checks if the given error was due to an invalid hosting link domain.
func IsInvalidHostingLinkDomain(err error) bool {
return hasAuthErrorCode(err, invalidHostingLinkDomain)
}

// IsInvalidEmail checks if the given error was due to an invalid email.
//
// Deprecated: Always returns false.
Expand Down Expand Up @@ -1447,6 +1453,11 @@ var serverError = map[string]*authError{
message: "the provided dynamic link domain is not configured or authorized for the current project",
authCode: invalidDynamicLinkDomain,
},
"INVALID_HOSTING_LINK_DOMAIN": {
code: internal.InvalidArgument,
message: "the provided hosting link domain is not configured in Firebase Hosting or is not owned by the current project",
authCode: invalidHostingLinkDomain,
},
"PHONE_NUMBER_EXISTS": {
code: internal.AlreadyExists,
message: "user with the provided phone number already exists",
Expand Down
5 changes: 5 additions & 0 deletions auth/user_mgt_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2151,6 +2151,11 @@ func TestHTTPErrorWithCode(t *testing.T) {
errorutils.IsInvalidArgument,
"the provided dynamic link domain is not configured or authorized for the current project",
},
"INVALID_HOSTING_LINK_DOMAIN": {
IsInvalidHostingLinkDomain,
errorutils.IsInvalidArgument,
"the provided hosting link domain is not configured in Firebase Hosting or is not owned by the current project",
},
"PHONE_NUMBER_EXISTS": {
IsPhoneNumberAlreadyExists,
errorutils.IsAlreadyExists,
Expand Down