Skip to content

Commit 05082e4

Browse files
committed
Update BrowserSignin initializer to not throw unnecessarily
1 parent 4b386f1 commit 05082e4

5 files changed

Lines changed: 48 additions & 33 deletions

File tree

Sources/AuthFoundation/JWT/Protocols/Claim.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import Foundation
1414

1515
/// Indicates a type that can be used as an enum value for the ``HasClaims/ClaimType`` associated type.
16-
public protocol IsClaim: RawRepresentable<String> {}
16+
public protocol IsClaim: RawRepresentable<String>, Sendable, Hashable, Equatable {}
1717

1818
/// Used by classes that contains OAuth2 claims.
1919
///

Sources/BrowserSignin/BrowserSignin.swift

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -225,14 +225,25 @@ public final class BrowserSignin {
225225
scope: ClaimCollection<[String]>,
226226
redirectUri: URL,
227227
logoutRedirectUri: URL? = nil,
228-
additionalParameters: [String: any APIRequestArgument]? = nil) throws
228+
additionalParameters: [String: any APIRequestArgument]? = nil)
229229
{
230-
let client = OAuth2Client(issuerURL: issuerURL,
231-
clientId: clientId,
232-
scope: scope,
233-
redirectUri: redirectUri,
234-
logoutRedirectUri: logoutRedirectUri)
235-
try self.init(client: client, additionalParameters: additionalParameters)
230+
let loginFlow = AuthorizationCodeFlow(issuerURL: issuerURL,
231+
clientId: clientId,
232+
scope: scope,
233+
redirectUri: redirectUri,
234+
logoutRedirectUri: logoutRedirectUri,
235+
additionalParameters: additionalParameters)
236+
let client = loginFlow.client
237+
238+
let logoutFlow: SessionLogoutFlow?
239+
if client.configuration.logoutRedirectUri != nil {
240+
logoutFlow = SessionLogoutFlow(client: client,
241+
additionalParameters: additionalParameters)
242+
} else {
243+
logoutFlow = nil
244+
}
245+
246+
self.init(loginFlow: loginFlow, logoutFlow: logoutFlow)
236247
}
237248

238249
@_documentation(visibility: private)
@@ -241,34 +252,29 @@ public final class BrowserSignin {
241252
scope: some WhitespaceSeparated,
242253
redirectUri: URL,
243254
logoutRedirectUri: URL? = nil,
244-
additionalParameters: [String: any APIRequestArgument]? = nil) throws
255+
additionalParameters: [String: any APIRequestArgument]? = nil)
245256
{
246-
let client = OAuth2Client(issuerURL: issuerURL,
247-
clientId: clientId,
248-
scope: scope,
249-
redirectUri: redirectUri,
250-
logoutRedirectUri: logoutRedirectUri)
251-
try self.init(client: client, additionalParameters: additionalParameters)
257+
self.init(issuerURL: issuerURL,
258+
clientId: clientId,
259+
scope: .init(wrappedValue: scope.whitespaceSeparated),
260+
redirectUri: redirectUri,
261+
logoutRedirectUri: logoutRedirectUri,
262+
additionalParameters: additionalParameters)
252263
}
253264

254265
convenience init(_ config: OAuth2Client.PropertyListConfiguration) throws {
255-
try self.init(client: OAuth2Client(config),
256-
additionalParameters: config.additionalParameters)
257-
}
258-
259-
convenience init(client: OAuth2Client, additionalParameters: [String: any APIRequestArgument]?) throws {
266+
let client = try OAuth2Client(config)
260267
let loginFlow = try AuthorizationCodeFlow(client: client,
261-
additionalParameters: additionalParameters)
268+
additionalParameters: config.additionalParameters)
262269
let logoutFlow: SessionLogoutFlow?
263270
if client.configuration.logoutRedirectUri != nil {
264271
logoutFlow = SessionLogoutFlow(client: client,
265-
additionalParameters: additionalParameters)
272+
additionalParameters: config.additionalParameters)
266273
} else {
267274
logoutFlow = nil
268275
}
269276

270277
self.init(loginFlow: loginFlow, logoutFlow: logoutFlow)
271-
272278
}
273279

274280
/// Initializes a web authentication session using the supplied AuthorizationCodeFlow and optional context.

Sources/OAuth2Auth/Authentication/AuthorizationCodeFlow.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,21 @@ public actor AuthorizationCodeFlow: AuthenticationFlow {
8888
/// - clientId: The client ID.
8989
/// - scope: The scopes to request.
9090
/// - redirectUri: The redirect URI for the client.
91+
/// - logoutRedirectUri: The logout URI for the client, if applicable.
9192
/// - additionalParameters: Optional additional query string parameters you would like to supply to the authorization server.
9293
@inlinable
9394
public init(issuerURL: URL,
9495
clientId: String,
9596
scope: ClaimCollection<[String]>,
9697
redirectUri: URL,
98+
logoutRedirectUri: URL? = nil,
9799
additionalParameters: [String: any APIRequestArgument]? = nil)
98100
{
99101
self.init(verifiedClient: OAuth2Client(issuerURL: issuerURL,
100102
clientId: clientId,
101103
scope: scope,
102-
redirectUri: redirectUri),
104+
redirectUri: redirectUri,
105+
logoutRedirectUri: logoutRedirectUri),
103106
additionalParameters: additionalParameters)
104107
}
105108

@@ -109,12 +112,14 @@ public actor AuthorizationCodeFlow: AuthenticationFlow {
109112
clientId: String,
110113
scope: some WhitespaceSeparated,
111114
redirectUri: URL,
115+
logoutRedirectUri: URL? = nil,
112116
additionalParameters: [String: any APIRequestArgument]? = nil)
113117
{
114118
self.init(verifiedClient: OAuth2Client(issuerURL: issuerURL,
115119
clientId: clientId,
116120
scope: .init(wrappedValue: scope.whitespaceSeparated),
117-
redirectUri: redirectUri),
121+
redirectUri: redirectUri,
122+
logoutRedirectUri: logoutRedirectUri),
118123
additionalParameters: additionalParameters)
119124
}
120125

Tests/BrowserSigninTests/BrowserSigninFlowTests.swift

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ class BrowserSigninFlowTests: XCTestCase {
5959

6060
@MainActor
6161
func testStart() async throws {
62-
let webAuth = try BrowserSignin(client: client,
63-
additionalParameters: ["testName": name])
62+
let loginFlow = try AuthorizationCodeFlow(client: client,
63+
additionalParameters: ["testName": name])
64+
let webAuth = BrowserSignin(loginFlow: loginFlow, logoutFlow: nil)
6465

6566
try await BrowserSigninProviderFactoryMock.register(
6667
result: .success(URL(string: "com.example:/callback?state=qwe&code=the_auth_code")!),
@@ -87,8 +88,11 @@ class BrowserSigninFlowTests: XCTestCase {
8788

8889
@MainActor
8990
func testLogout() async throws {
90-
let webAuth = try BrowserSignin(client: client,
91-
additionalParameters: ["testName": name])
91+
let loginFlow = try AuthorizationCodeFlow(client: client,
92+
additionalParameters: ["testName": name])
93+
let logoutFlow = SessionLogoutFlow(client: loginFlow.client,
94+
additionalParameters: loginFlow.additionalParameters)
95+
let webAuth = BrowserSignin(loginFlow: loginFlow, logoutFlow: logoutFlow)
9296

9397
try await BrowserSigninProviderFactoryMock.register(
9498
result: .success(URL(string: "com.example:/logout?state=qwe")!),
@@ -114,9 +118,9 @@ class BrowserSigninFlowTests: XCTestCase {
114118
}
115119

116120
func testCancel() async throws {
117-
let webAuth = try await BrowserSignin(
118-
client: client,
119-
additionalParameters: ["testName": name])
121+
let loginFlow = try AuthorizationCodeFlow(client: client,
122+
additionalParameters: ["testName": name])
123+
let webAuth = await BrowserSignin(loginFlow: loginFlow, logoutFlow: nil)
120124

121125
try await BrowserSigninProviderFactoryMock.register(
122126
result: .failure(NSError(domain: ASWebAuthenticationSessionErrorDomain,

Tests/BrowserSigninTests/BrowserSigninInitializerTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class BrowserSigninInitializerTests: XCTestCase {
2222
private let logoutRedirectUri = URL(string: "com.example:/logout")!
2323

2424
func testInitializer() async throws {
25-
let auth = try await BrowserSignin(
25+
let auth = await BrowserSignin(
2626
issuerURL: issuer,
2727
clientId: "client_id",
2828
scope: "openid profile",

0 commit comments

Comments
 (0)