WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
31 changes: 29 additions & 2 deletions Sources/Authsignal/AuthsignalPasskey.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@ public class AuthsignalPasskey {
passkeyManager = PasskeyManager()
}

public func signUp(token: String? = nil, username: String? = nil, displayName: String? = nil) async -> AuthsignalResponse<SignUpResponse> {
public func signUp(
token: String? = nil,
username: String? = nil,
displayName: String? = nil,
ignorePasskeyAlreadyExistsError: Bool = false
) async -> AuthsignalResponse<SignUpResponse> {
guard let userToken = token ?? cache.token else { return cache.handleTokenNotSetError() }

let optsResponse = await api.registrationOptions(token: userToken, username: username, displayName: displayName)
Expand All @@ -33,8 +38,12 @@ public class AuthsignalPasskey {
existingCredentialIds: optsData.options.excludeCredentials.map { $0.id }
)

if ignorePasskeyAlreadyExistsError && credentialResponse.errorCode == SdkErrorCodes.matchedExcludedCredential {
return AuthsignalResponse(error: nil)
}

if let error = credentialResponse.error {
return AuthsignalResponse(error: error)
return AuthsignalResponse(error: error, errorCode: credentialResponse.errorCode)
}

guard let credential = credentialResponse.data else {
Expand Down Expand Up @@ -149,6 +158,24 @@ public class AuthsignalPasskey {
}
}

public func shouldPromptToCreatePasskey() async -> AuthsignalResponse<Bool> {
guard let credentialId = UserDefaults.standard.string(forKey: passkeyLocalKey) else {
return AuthsignalResponse(data: true)
}

let passkeyAuthenticatorResponse = await api.getPasskeyAuthenticator(credentialId: credentialId)

if passkeyAuthenticatorResponse.errorCode == SdkErrorCodes.invalidCredential {
return AuthsignalResponse(data: true)
}

return AuthsignalResponse(
data: false,
error: passkeyAuthenticatorResponse.error,
errorCode: passkeyAuthenticatorResponse.errorCode
)
}

@available(*, deprecated, message: "Use 'preferImmediatelyAvailableCredentials' to control what happens when a passkey isn't available.")
public func isAvailableOnDevice() async -> AuthsignalResponse<Bool> {
guard let credentialId = UserDefaults.standard.string(forKey: passkeyLocalKey) else {
Expand Down
5 changes: 5 additions & 0 deletions Sources/Authsignal/Models/SdkErrorCodes.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
struct SdkErrorCodes {
static let userCanceled = "user_canceled"
static let invalidCredential = "invalid_credential"
static let matchedExcludedCredential = "matched_excluded_credential"
}
4 changes: 2 additions & 2 deletions Sources/Authsignal/Security/PasskeyManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class PasskeyManager: NSObject {
authError.code == .matchedExcludedCredential {
return AuthsignalResponse(
error: "An existing credential is already available for this device.",
errorCode: "matched_excluded_credential"
errorCode: SdkErrorCodes.matchedExcludedCredential
)
}

Expand Down Expand Up @@ -181,7 +181,7 @@ class PasskeyManager: NSObject {

return AuthsignalResponse(
error: "The request was canceled by the user or the device has no passkeys available.",
errorCode: "user_canceled"
errorCode: SdkErrorCodes.userCanceled
)
} catch {
self.controller = nil
Expand Down
Loading