Skip to content

Commit 20e2f54

Browse files
Add new enum case for explicitly passing ASAuthorizationController.RequestOptions (#588)
* Add new enum case for explicitly passing ASAuthorizationController.RequestOptions * Lint
1 parent 3171007 commit 20e2f54

File tree

3 files changed

+15
-4
lines changed

3 files changed

+15
-4
lines changed

Sources/StytchCore/PasskeysClient/PasskeysClient+Live.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ extension PasskeysClient {
4949
controller.performAutoFillAssistedRequests()
5050
case let .default(preferLocalCredentials):
5151
controller.performRequests(options: preferLocalCredentials ? .preferImmediatelyAvailableCredentials : [])
52+
case let .options(requestOptions):
53+
controller.performRequests(options: requestOptions)
5254
}
5355
#else
5456
controller.performRequests()

Sources/StytchCore/StytchClient/Passkeys/StytchClient+Passkeys.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import Foundation
33

44
#if !os(watchOS)
5+
import AuthenticationServices
6+
57
public extension StytchClient {
68
/// Passkeys are an extremely simple authentication mechanism which securely syncs key sets across your devices — access-controlled via FaceID/TouchID — ultimately enabling WebAuthN-powered public-key authentication with Stytch's servers.
79
///
@@ -127,7 +129,10 @@ public extension StytchClient.Passkeys {
127129
public enum RequestBehavior: Sendable {
128130
#if os(iOS)
129131
/// Uses the default request behavior with a boolean flag to determine whether credentials are limited to those local on device or whether a passkey on a nearby device can be used
132+
@available(*, deprecated, renamed: "options(requestOptions:)", message: "Deprecated in favor of explicitly passing the desired ASAuthorizationController.RequestOptions")
130133
case `default`(preferLocalCredentials: Bool)
134+
/// Explicitly pass the desired `ASAuthorizationController.RequestOptions` to the authenticate request, for instance `[.preferImmediatelyAvailableCredentials]`
135+
case options(_: ASAuthorizationController.RequestOptions = [])
131136
/// When a user selects a textfield with the `.username` textContentType, an existing local passkey will be suggested to the user.
132137
case autoFill
133138
#else
@@ -136,8 +141,8 @@ public extension StytchClient.Passkeys {
136141
#endif
137142

138143
#if os(iOS)
139-
/// The RequestBehavior parameter's default value for this platform — `.default(prefersLocalCredentials: false)`
140-
public static let defaultPlatformValue: RequestBehavior = .default(preferLocalCredentials: false)
144+
/// The RequestBehavior parameter's default value for this platform — `.options([])`
145+
public static let defaultPlatformValue: RequestBehavior = .options([])
141146
#else
142147
/// The RequestBehavior parameter's default value for this platform — `.default`
143148
public static let defaultPlatformValue: RequestBehavior = .default

Tests/StytchCoreTests/PasskeysTestCase.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,15 @@ final class PasskeysTestCase: BaseTestCase {
5353
AuthenticateResponse.mock
5454
}
5555
var requestBehaviorIsAutoFill = false
56+
var requestBehaviorIsPreferLocallyAvailableCredentials = false
5657
Current.passkeysClient.assertCredential = { _, _, requestBehavior in
5758
#if os(iOS)
5859
if case .autoFill = requestBehavior {
5960
requestBehaviorIsAutoFill = true
6061
}
62+
if case .options([.preferImmediatelyAvailableCredentials]) = requestBehavior {
63+
requestBehaviorIsPreferLocallyAvailableCredentials = true
64+
}
6165
#endif
6266
return MockAssertion(
6367
rawAuthenticatorData: .init("fake_auth_data".utf8),
@@ -69,13 +73,13 @@ final class PasskeysTestCase: BaseTestCase {
6973
}
7074
Current.timer = { _, _, _ in Self.mockTimer }
7175
#if os(iOS)
72-
let parameters: Base.AuthenticateParameters = .init(domain: "something.blah.com", requestBehavior: .autoFill)
76+
let parameters: Base.AuthenticateParameters = .init(domain: "something.blah.com", requestBehavior: .options([.preferImmediatelyAvailableCredentials]))
7377
#else
7478
let parameters: Base.AuthenticateParameters = .init(domain: "something.blah.com")
7579
#endif
7680
_ = try await StytchClient.passkeys.authenticate(parameters: parameters)
7781
#if os(iOS)
78-
XCTAssertTrue(requestBehaviorIsAutoFill)
82+
XCTAssertTrue(requestBehaviorIsPreferLocallyAvailableCredentials)
7983
#else
8084
XCTAssertFalse(requestBehaviorIsAutoFill)
8185
#endif

0 commit comments

Comments
 (0)