Skip to content

Commit af1e70b

Browse files
committed
Add rCE support for phone MFA enrollment and sign-in (rce-main #2) (#14081)
1 parent a4b6608 commit af1e70b

File tree

6 files changed

+68
-5
lines changed

6 files changed

+68
-5
lines changed

FirebaseAuth/Sources/Swift/AuthProvider/PhoneAuthProvider.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ import Foundation
199199
}
200200

201201
let recaptchaVerifier = AuthRecaptchaVerifier.shared(auth: auth)
202-
try await recaptchaVerifier.retrieveRecaptchaConfig(forceRefresh: false)
202+
try await recaptchaVerifier.retrieveRecaptchaConfig(forceRefresh: true)
203203

204204
switch recaptchaVerifier.enablementStatus(forProvider: .phone) {
205205
case .off:
@@ -321,7 +321,7 @@ import Foundation
321321
try await recaptchaVerifier.injectRecaptchaFields(
322322
request: request,
323323
provider: .phone,
324-
action: .startMfaEnrollment
324+
action: .mfaSmsEnrollment
325325
)
326326
let response = try await AuthBackend.call(with: request)
327327
return response.phoneSessionInfo?.sessionInfo
@@ -333,7 +333,7 @@ import Foundation
333333
try await recaptchaVerifier.injectRecaptchaFields(
334334
request: request,
335335
provider: .phone,
336-
action: .startMfaSignin
336+
action: .mfaSmsSignIn
337337
)
338338
let response = try await AuthBackend.call(with: request)
339339
return response.responseInfo?.sessionInfo

FirebaseAuth/Sources/Swift/Backend/AuthBackend.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ final class AuthBackend: AuthBackendProtocol {
177177
withJSONObject: postBody,
178178
options: JSONWritingOptions
179179
)
180+
180181
if bodyData == nil {
181182
// This is an untested case. This happens exclusively when there is an error in the
182183
// framework implementation of dataWithJSONObject:options:error:. This shouldn't normally

FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/Enroll/StartMFAEnrollmentRequest.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ import Foundation
1616

1717
private let kStartMFAEnrollmentEndPoint = "accounts/mfaEnrollment:start"
1818

19+
/// The key for the "clientType" value in the request.
20+
private let kClientType = "clientType"
21+
22+
/// The key for the reCAPTCHAToken parameter in the request.
23+
private let kreCAPTCHATokenKey = "recaptchaToken"
24+
25+
/// The key for the "captchaResponse" value in the request.
26+
private let kCaptchaResponseKey = "captchaResponse"
27+
28+
/// The key for the "recaptchaVersion" value in the request.
29+
private let kRecaptchaVersion = "recaptchaVersion"
30+
1931
/// The key for the tenant id value in the request.
2032
private let kTenantIDKey = "tenantId"
2133

@@ -79,4 +91,15 @@ class StartMFAEnrollmentRequest: IdentityToolkitRequest, AuthRPCRequest {
7991
}
8092
return body
8193
}
94+
95+
func injectRecaptchaFields(recaptchaResponse: String?, recaptchaVersion: String) {
96+
// reCAPTCHA check is only available for phone based MFA
97+
if let phoneEnrollmentInfo {
98+
phoneEnrollmentInfo.injectRecaptchaFields(
99+
recaptchaResponse: recaptchaResponse,
100+
recaptchaVersion: recaptchaVersion,
101+
clientType: clientType
102+
)
103+
}
104+
}
82105
}

FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/SignIn/StartMFASignInRequest.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,15 @@ class StartMFASignInRequest: IdentityToolkitRequest, AuthRPCRequest {
5757
}
5858
return body
5959
}
60+
61+
func injectRecaptchaFields(recaptchaResponse: String?, recaptchaVersion: String) {
62+
// reCAPTCHA check is only available for phone based MFA
63+
if let signInInfo {
64+
signInInfo.injectRecaptchaFields(
65+
recaptchaResponse: recaptchaResponse,
66+
recaptchaVersion: recaptchaVersion,
67+
clientType: clientType
68+
)
69+
}
70+
}
6071
}

FirebaseAuth/Sources/Swift/Backend/RPC/Proto/Phone/AuthProtoStartMFAPhoneRequestInfo.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,25 @@ private let kSecretKey = "iosSecret"
2626
/// The key for the reCAPTCHAToken parameter in the request.
2727
private let kreCAPTCHATokenKey = "recaptchaToken"
2828

29+
/// The key for the "captchaResponse" value in the request.
30+
private let kCaptchaResponseKey = "captchaResponse"
31+
32+
/// The key for the "recaptchaVersion" value in the request.
33+
private let kRecaptchaVersion = "recaptchaVersion"
34+
35+
/// The key for the "clientType" value in the request.
36+
private let kClientType = "clientType"
37+
2938
class AuthProtoStartMFAPhoneRequestInfo: NSObject, AuthProto {
3039
required init(dictionary: [String: AnyHashable]) {
3140
fatalError()
3241
}
3342

3443
var phoneNumber: String?
3544
var codeIdentity: CodeIdentity
45+
var captchaResponse: String?
46+
var recaptchaVersion: String?
47+
var clientType: String?
3648
init(phoneNumber: String?, codeIdentity: CodeIdentity) {
3749
self.phoneNumber = phoneNumber
3850
self.codeIdentity = codeIdentity
@@ -43,6 +55,15 @@ class AuthProtoStartMFAPhoneRequestInfo: NSObject, AuthProto {
4355
if let phoneNumber = phoneNumber {
4456
dict[kPhoneNumberKey] = phoneNumber
4557
}
58+
if let captchaResponse = captchaResponse {
59+
dict[kCaptchaResponseKey] = captchaResponse
60+
}
61+
if let recaptchaVersion = recaptchaVersion {
62+
dict[kRecaptchaVersion] = recaptchaVersion
63+
}
64+
if let clientType = clientType {
65+
dict[kClientType] = clientType
66+
}
4667
switch codeIdentity {
4768
case let .credential(appCredential):
4869
dict[kReceiptKey] = appCredential.receipt
@@ -54,4 +75,11 @@ class AuthProtoStartMFAPhoneRequestInfo: NSObject, AuthProto {
5475
}
5576
return dict
5677
}
78+
79+
func injectRecaptchaFields(recaptchaResponse: String?, recaptchaVersion: String,
80+
clientType: String?) {
81+
captchaResponse = recaptchaResponse
82+
self.recaptchaVersion = recaptchaVersion
83+
self.clientType = clientType
84+
}
5785
}

FirebaseAuth/Sources/Swift/Utilities/AuthRecaptchaVerifier.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@
5959
case getOobCode
6060
case signUpPassword
6161
case sendVerificationCode
62-
case startMfaSignin
63-
case startMfaEnrollment
62+
case mfaSmsSignIn
63+
case mfaSmsEnrollment
6464

6565
// Convenience property for mapping values
6666
var stringValue: String { rawValue }

0 commit comments

Comments
 (0)