From d70aeacd944cfd45f367ae763c070308810883e4 Mon Sep 17 00:00:00 2001 From: George Bafaloukas Date: Tue, 25 Jul 2023 14:47:40 +0100 Subject: [PATCH 1/2] Adding Passkeys Sample accompanying the Passwordless blogpost --- .../project.pbxproj | 436 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 77 ++++ .../UnsummitAuthentication/AppDelegate.swift | 40 ++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 ++++ .../ApprovedIcon.imageset/Contents.json | 23 + .../ApprovedIcon.imageset/approved@1x.png | Bin 0 -> 951 bytes .../ApprovedIcon.imageset/approved@2x.png | Bin 0 -> 2857 bytes .../ApprovedIcon.imageset/approved@3x.png | Bin 0 -> 5711 bytes .../Assets.xcassets/Contents.json | 6 + .../pebble-logo.imageset/Contents.json | 21 + .../pebble-logo.imageset/pebble-logo.png | Bin 0 -> 8660 bytes .../AuthenticatedViewController.swift | 89 ++++ .../Base.lproj/LaunchScreen.storyboard | 25 + .../Base.lproj/Main.storyboard | 374 +++++++++++++++ .../BioExample.entitlements | 10 + .../UnsummitAuthentication/Info.plist | 110 +++++ .../LoginViewController.swift | 320 +++++++++++++ .../PebbleBankUtilities.swift | 78 ++++ .../SettingsViewController.swift | 133 ++++++ .../UnsummitAuthentication.entitlements | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + 23 files changed, 1877 insertions(+) create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.pbxproj create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/AppDelegate.swift create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/ApprovedIcon.imageset/Contents.json create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/ApprovedIcon.imageset/approved@1x.png create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/ApprovedIcon.imageset/approved@2x.png create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/ApprovedIcon.imageset/approved@3x.png create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/Contents.json create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/pebble-logo.imageset/Contents.json create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/pebble-logo.imageset/pebble-logo.png create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/AuthenticatedViewController.swift create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Base.lproj/LaunchScreen.storyboard create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Base.lproj/Main.storyboard create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/BioExample.entitlements create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Info.plist create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/LoginViewController.swift create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/PebbleBankUtilities.swift create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/SettingsViewController.swift create mode 100644 SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/UnsummitAuthentication.entitlements create mode 100644 SampleApps/QuickstartExample/Quickstart.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.pbxproj b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.pbxproj new file mode 100644 index 00000000..be73f571 --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.pbxproj @@ -0,0 +1,436 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 52; + objects = { + +/* Begin PBXBuildFile section */ + EC0BA22A282AA69E00F8326E /* JGProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = EC0BA229282AA69E00F8326E /* JGProgressHUD */; }; + EC1A825A2822D0D1008D81BA /* FRAuth in Frameworks */ = {isa = PBXBuildFile; productRef = EC1A82592822D0D1008D81BA /* FRAuth */; }; + EC1A825C2822D0D1008D81BA /* FRCore in Frameworks */ = {isa = PBXBuildFile; productRef = EC1A825B2822D0D1008D81BA /* FRCore */; }; + EC1A825E2822D0D1008D81BA /* FRFacebookSignIn in Frameworks */ = {isa = PBXBuildFile; productRef = EC1A825D2822D0D1008D81BA /* FRFacebookSignIn */; }; + EC1A82602822D0D1008D81BA /* FRGoogleSignIn in Frameworks */ = {isa = PBXBuildFile; productRef = EC1A825F2822D0D1008D81BA /* FRGoogleSignIn */; }; + EC4F96C12695E82400B3C9B8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC4F96C02695E82400B3C9B8 /* AppDelegate.swift */; }; + EC4F96C52695E82400B3C9B8 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC4F96C42695E82400B3C9B8 /* LoginViewController.swift */; }; + EC4F96C82695E82400B3C9B8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EC4F96C62695E82400B3C9B8 /* Main.storyboard */; }; + EC4F96CA2695E82500B3C9B8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC4F96C92695E82500B3C9B8 /* Assets.xcassets */; }; + EC4F96CD2695E82500B3C9B8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EC4F96CB2695E82500B3C9B8 /* LaunchScreen.storyboard */; }; + ECA14863282A6F7900D52E7D /* AuthenticatedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA14862282A6F7900D52E7D /* AuthenticatedViewController.swift */; }; + ECD8E04E2A6E811C009C421C /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECD8E04D2A6E811C009C421C /* SettingsViewController.swift */; }; + ECD8E0502A6E8AAF009C421C /* PebbleBankUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECD8E04F2A6E8AAF009C421C /* PebbleBankUtilities.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + EC3A95FF27C8E9150094C650 /* FRCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = FRCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EC4F96BD2695E82400B3C9B8 /* UnsummitAuthentication.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = UnsummitAuthentication.app; sourceTree = BUILT_PRODUCTS_DIR; }; + EC4F96C02695E82400B3C9B8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + EC4F96C42695E82400B3C9B8 /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; + EC4F96C72695E82400B3C9B8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + EC4F96C92695E82500B3C9B8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + EC4F96CC2695E82500B3C9B8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + EC4F96CE2695E82500B3C9B8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + ECA14862282A6F7900D52E7D /* AuthenticatedViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticatedViewController.swift; sourceTree = ""; }; + ECD8E04D2A6E811C009C421C /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; + ECD8E04F2A6E8AAF009C421C /* PebbleBankUtilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PebbleBankUtilities.swift; sourceTree = ""; }; + ECEAA19E2A375443004F5823 /* UnsummitAuthentication.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = UnsummitAuthentication.entitlements; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + EC4F96BA2695E82400B3C9B8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EC1A825E2822D0D1008D81BA /* FRFacebookSignIn in Frameworks */, + EC1A825A2822D0D1008D81BA /* FRAuth in Frameworks */, + EC1A825C2822D0D1008D81BA /* FRCore in Frameworks */, + EC1A82602822D0D1008D81BA /* FRGoogleSignIn in Frameworks */, + EC0BA22A282AA69E00F8326E /* JGProgressHUD in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + EC4F96B42695E82400B3C9B8 = { + isa = PBXGroup; + children = ( + EC4F96BF2695E82400B3C9B8 /* UnsummitAuthentication */, + EC4F96BE2695E82400B3C9B8 /* Products */, + F84DC7CFEA86E95FDAA1F6EB /* Frameworks */, + ); + sourceTree = ""; + }; + EC4F96BE2695E82400B3C9B8 /* Products */ = { + isa = PBXGroup; + children = ( + EC4F96BD2695E82400B3C9B8 /* UnsummitAuthentication.app */, + ); + name = Products; + sourceTree = ""; + }; + EC4F96BF2695E82400B3C9B8 /* UnsummitAuthentication */ = { + isa = PBXGroup; + children = ( + ECEAA19E2A375443004F5823 /* UnsummitAuthentication.entitlements */, + EC4F96C02695E82400B3C9B8 /* AppDelegate.swift */, + EC4F96C42695E82400B3C9B8 /* LoginViewController.swift */, + ECA14862282A6F7900D52E7D /* AuthenticatedViewController.swift */, + ECD8E04D2A6E811C009C421C /* SettingsViewController.swift */, + EC4F96C62695E82400B3C9B8 /* Main.storyboard */, + EC4F96C92695E82500B3C9B8 /* Assets.xcassets */, + EC4F96CB2695E82500B3C9B8 /* LaunchScreen.storyboard */, + EC4F96CE2695E82500B3C9B8 /* Info.plist */, + ECD8E04F2A6E8AAF009C421C /* PebbleBankUtilities.swift */, + ); + path = UnsummitAuthentication; + sourceTree = ""; + }; + F84DC7CFEA86E95FDAA1F6EB /* Frameworks */ = { + isa = PBXGroup; + children = ( + EC3A95FF27C8E9150094C650 /* FRCore.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + EC4F96BC2695E82400B3C9B8 /* UnsummitAuthentication */ = { + isa = PBXNativeTarget; + buildConfigurationList = EC4F96D12695E82500B3C9B8 /* Build configuration list for PBXNativeTarget "UnsummitAuthentication" */; + buildPhases = ( + EC4F96B92695E82400B3C9B8 /* Sources */, + EC4F96BA2695E82400B3C9B8 /* Frameworks */, + EC4F96BB2695E82400B3C9B8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = UnsummitAuthentication; + packageProductDependencies = ( + EC1A82592822D0D1008D81BA /* FRAuth */, + EC1A825B2822D0D1008D81BA /* FRCore */, + EC1A825D2822D0D1008D81BA /* FRFacebookSignIn */, + EC1A825F2822D0D1008D81BA /* FRGoogleSignIn */, + EC0BA229282AA69E00F8326E /* JGProgressHUD */, + ); + productName = BioExample; + productReference = EC4F96BD2695E82400B3C9B8 /* UnsummitAuthentication.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + EC4F96B52695E82400B3C9B8 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1240; + LastUpgradeCheck = 1240; + TargetAttributes = { + EC4F96BC2695E82400B3C9B8 = { + CreatedOnToolsVersion = 12.4; + }; + }; + }; + buildConfigurationList = EC4F96B82695E82400B3C9B8 /* Build configuration list for PBXProject "UnsummitAuthentication" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = EC4F96B42695E82400B3C9B8; + packageReferences = ( + EC1A82582822D0D1008D81BA /* XCRemoteSwiftPackageReference "forgerock-ios-sdk" */, + EC0BA228282AA69E00F8326E /* XCRemoteSwiftPackageReference "JGProgressHUD" */, + ); + productRefGroup = EC4F96BE2695E82400B3C9B8 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + EC4F96BC2695E82400B3C9B8 /* UnsummitAuthentication */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + EC4F96BB2695E82400B3C9B8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EC4F96CD2695E82500B3C9B8 /* LaunchScreen.storyboard in Resources */, + EC4F96CA2695E82500B3C9B8 /* Assets.xcassets in Resources */, + EC4F96C82695E82400B3C9B8 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + EC4F96B92695E82400B3C9B8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EC4F96C52695E82400B3C9B8 /* LoginViewController.swift in Sources */, + ECD8E0502A6E8AAF009C421C /* PebbleBankUtilities.swift in Sources */, + ECA14863282A6F7900D52E7D /* AuthenticatedViewController.swift in Sources */, + EC4F96C12695E82400B3C9B8 /* AppDelegate.swift in Sources */, + ECD8E04E2A6E811C009C421C /* SettingsViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + EC4F96C62695E82400B3C9B8 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + EC4F96C72695E82400B3C9B8 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + EC4F96CB2695E82500B3C9B8 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + EC4F96CC2695E82500B3C9B8 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + EC4F96CF2695E82500B3C9B8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + EC4F96D02695E82500B3C9B8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + EC4F96D22695E82500B3C9B8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = UnsummitAuthentication/UnsummitAuthentication.entitlements; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 9QSE66762D; + INFOPLIST_FILE = UnsummitAuthentication/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.forgerock.unsummit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + EC4F96D32695E82500B3C9B8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = UnsummitAuthentication/UnsummitAuthentication.entitlements; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 9QSE66762D; + INFOPLIST_FILE = UnsummitAuthentication/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.forgerock.unsummit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + EC4F96B82695E82400B3C9B8 /* Build configuration list for PBXProject "UnsummitAuthentication" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EC4F96CF2695E82500B3C9B8 /* Debug */, + EC4F96D02695E82500B3C9B8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EC4F96D12695E82500B3C9B8 /* Build configuration list for PBXNativeTarget "UnsummitAuthentication" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EC4F96D22695E82500B3C9B8 /* Debug */, + EC4F96D32695E82500B3C9B8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + EC0BA228282AA69E00F8326E /* XCRemoteSwiftPackageReference "JGProgressHUD" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/JonasGessner/JGProgressHUD.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.0.0; + }; + }; + EC1A82582822D0D1008D81BA /* XCRemoteSwiftPackageReference "forgerock-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/ForgeRock/forgerock-ios-sdk.git"; + requirement = { + kind = exactVersion; + version = 4.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + EC0BA229282AA69E00F8326E /* JGProgressHUD */ = { + isa = XCSwiftPackageProductDependency; + package = EC0BA228282AA69E00F8326E /* XCRemoteSwiftPackageReference "JGProgressHUD" */; + productName = JGProgressHUD; + }; + EC1A82592822D0D1008D81BA /* FRAuth */ = { + isa = XCSwiftPackageProductDependency; + package = EC1A82582822D0D1008D81BA /* XCRemoteSwiftPackageReference "forgerock-ios-sdk" */; + productName = FRAuth; + }; + EC1A825B2822D0D1008D81BA /* FRCore */ = { + isa = XCSwiftPackageProductDependency; + package = EC1A82582822D0D1008D81BA /* XCRemoteSwiftPackageReference "forgerock-ios-sdk" */; + productName = FRCore; + }; + EC1A825D2822D0D1008D81BA /* FRFacebookSignIn */ = { + isa = XCSwiftPackageProductDependency; + package = EC1A82582822D0D1008D81BA /* XCRemoteSwiftPackageReference "forgerock-ios-sdk" */; + productName = FRFacebookSignIn; + }; + EC1A825F2822D0D1008D81BA /* FRGoogleSignIn */ = { + isa = XCSwiftPackageProductDependency; + package = EC1A82582822D0D1008D81BA /* XCRemoteSwiftPackageReference "forgerock-ios-sdk" */; + productName = FRGoogleSignIn; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = EC4F96B52695E82400B3C9B8 /* Project object */; +} diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..ca863a55 --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,77 @@ +{ + "pins" : [ + { + "identity" : "appauth-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/openid/AppAuth-iOS.git", + "state" : { + "revision" : "33660c271c961f8ce1084cc13f2ea8195e864f7d", + "version" : "1.5.0" + } + }, + { + "identity" : "facebook-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/facebook/facebook-ios-sdk.git", + "state" : { + "revision" : "5c7367dadcbe504702c041621dc09752bf2cd747", + "version" : "16.0.1" + } + }, + { + "identity" : "forgerock-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ForgeRock/forgerock-ios-sdk.git", + "state" : { + "revision" : "d78e9f26be17df12476198a4fae1ef532432ab8b", + "version" : "4.0.0" + } + }, + { + "identity" : "googlesignin-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleSignIn-iOS.git", + "state" : { + "revision" : "7932d33686c1dc4d7df7a919aae47361d1cdfda4", + "version" : "7.0.0" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "4e9bbf2808b8fee444e84a48f5f3c12641987d3e", + "version" : "1.7.2" + } + }, + { + "identity" : "gtmappauth", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GTMAppAuth.git", + "state" : { + "revision" : "b9d1683be336ba8c8d1c6867bafeb056a5399700", + "version" : "1.3.0" + } + }, + { + "identity" : "jgprogresshud", + "kind" : "remoteSourceControl", + "location" : "https://github.com/JonasGessner/JGProgressHUD.git", + "state" : { + "revision" : "78d7cd35f1d90ff74fd82e486f2cbe4b24be8cf9", + "version" : "2.2.0" + } + }, + { + "identity" : "joseswift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/airsidemobile/JOSESwift.git", + "state" : { + "revision" : "10ed3b6736def7c26eb87135466b1cb46ea7e37f", + "version" : "2.4.0" + } + } + ], + "version" : 2 +} diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/AppDelegate.swift b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/AppDelegate.swift new file mode 100644 index 00000000..2be899de --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/AppDelegate.swift @@ -0,0 +1,40 @@ +// +// AppDelegate.swift +// BioExample +// +// Created by George Bafaloukas on 07/07/2021. +// + +// Swift +// +// AppDelegate.swift +import UIKit +import FRAuth + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + + return true + } + + // This method is one of AppDelegate protocol that is invoked when iOS tries to open the app using the app's dedicated URL + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { + + let resumeURL = url // validate the resumeURI contains 'suspendedId' parameter + + // With given resumeURI, use FRSession to resume authenticate flow + FRSession.authenticate(resumeURI: resumeURL) { (token: Token?, node, error) in + // Handle Node, or the result of continuing the the authentication flow + } + + return true + } + + +} diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/AccentColor.colorset/Contents.json b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000..eb878970 --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/AppIcon.appiconset/Contents.json b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..9221b9bb --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/ApprovedIcon.imageset/Contents.json b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/ApprovedIcon.imageset/Contents.json new file mode 100644 index 00000000..81c78a4e --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/ApprovedIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "approved@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "approved@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "approved@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/ApprovedIcon.imageset/approved@1x.png b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/ApprovedIcon.imageset/approved@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..66c54a476099592cc01c887667ee7d9057d4d385 GIT binary patch literal 951 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 Hu0mjf1K^0K literal 0 HcmV?d00001 diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/ApprovedIcon.imageset/approved@3x.png b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/ApprovedIcon.imageset/approved@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ba811b254305abc298022f6391b7263a0e5f3c49 GIT binary patch literal 5711 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 BKAQjl literal 0 HcmV?d00001 diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/Contents.json b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/pebble-logo.imageset/Contents.json b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/pebble-logo.imageset/Contents.json new file mode 100644 index 00000000..0787471a --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/pebble-logo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "pebble-logo.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/pebble-logo.imageset/pebble-logo.png b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Assets.xcassets/pebble-logo.imageset/pebble-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..278a8afe449ac9cce7384873a73ecc369e10fecf GIT binary patch literal 8660 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 YmOr + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Base.lproj/Main.storyboard b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f409de43 --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Base.lproj/Main.storyboard @@ -0,0 +1,374 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/BioExample.entitlements b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/BioExample.entitlements new file mode 100644 index 00000000..d0dbd32d --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/BioExample.entitlements @@ -0,0 +1,10 @@ + + + + + keychain-access-groups + + $(AppIdentifierPrefix)com.forgerock.unsummitauthentication + + + diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Info.plist b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Info.plist new file mode 100644 index 00000000..0d2ddb2c --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Info.plist @@ -0,0 +1,110 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleURLTypes + + + CFBundleURLSchemes + + fb362269018758347 + + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.1091765886811-o3nq2d5non08be66qboob6qa3tbcaau1 + + + + CFBundleTypeRole + Editor + CFBundleURLName + com.forgerock.ios.frexample + CFBundleURLSchemes + + frauth + + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.662984678191-rh9p528s1cm26i8kgg1d22e6gdi7c279 + + + + CFBundleVersion + 1 + FacebookAppID + 362269018758347 + FacebookClientToken + f4dce9aa634e6f9029497849c53b7785 + FacebookDisplayName + BioExample + LSApplicationQueriesSchemes + + fbapi + fbapi20130214 + fbapi20130410 + fbapi20130702 + fbapi20131010 + fbapi20131219 + fbapi20140410 + fbapi20140116 + fbapi20150313 + fbapi20150629 + fbapi20160328 + fbauth + fb-messenger-share-api + fbauth2 + fbshareextension + + LSRequiresIPhoneOS + + NSBluetoothAlwaysUsageDescription + Use Bluetooth + NSFaceIDUsageDescription + Use FaceID for Web Authentication + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/LoginViewController.swift b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/LoginViewController.swift new file mode 100644 index 00000000..25cfb503 --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/LoginViewController.swift @@ -0,0 +1,320 @@ +// +// ViewController.swift +// BioExample +// +// Created by George Bafaloukas on 07/07/2021. +// + +import UIKit +import FRAuth +import FRCore +import WebKit +import JGProgressHUD + +class LoginViewController: UIViewController { + + @IBOutlet weak var statusLabel: UILabel! + @IBOutlet weak var loginStackView: UIStackView! + @IBOutlet weak var nextButton: UIButton! + @IBOutlet weak var step1StackView: UIStackView! + @IBOutlet weak var step2StackView: UIStackView! + @IBOutlet weak var step3StackView: UIStackView! + @IBOutlet weak var step4StackView: UIStackView! + + private var currentNode: Node? + private var textFieldArray = [UITextField]() + private let hud = JGProgressHUD() + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view. + self.statusLabel?.text = "Welcome to Pebble Bank" + let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap)) + view.addGestureRecognizer(tap) // Add gesture recognizer to background view + self.navigationItem.setHidesBackButton(true, animated: false) + + // START the FR SDK + do { + try FRAuth.start(options: PebbleBankUtilities.frCongiguration()) + print("SDK initialized successfully") + FRLog.setLogLevel([.error, .network]) + + } + catch { + print(error) + } + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.step1StackView.alpha = 0.0 + self.step2StackView.alpha = 0.0 + self.step3StackView.alpha = 0.0 + self.step4StackView.alpha = 0.0 + + self.updateStatus() + self.hud.textLabel.text = "Loading" + self.hud.show(in: self.view) + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.beginAuthentication() + } + } + + // MARK: - Private Methods + private func beginAuthentication() { + if let _ = FRUser.currentUser { + self.updateStatus() + self.goToNext() + } else { + if currentNode == nil { + self.hud.textLabel.text = "Calling journey" + // Call the default Login Journey or the Biometrics Journey + let journeyName = (UserDefaults.standard.object(forKey: PebbleBankUtilities.biometricsEnabledKey) as? Bool ?? false) ? PebbleBankUtilities.biometricsAuthenticationJourney : PebbleBankUtilities.mainAuthenticationJourney + + FRSession.authenticate(authIndexValue: journeyName) { (result: Token?, node, error) in + self.handleNode(token: result, node: node, error: error) + } + } else { + // Submit the Username/Password to AM + guard let thisNode = currentNode else { return } + var index = 0 + for textField in textFieldArray { + if let thisCallback: SingleValueCallback = thisNode.callbacks[index] as? SingleValueCallback { + thisCallback.setValue(textField.text) + } + index += 1 + } + + self.textFieldArray = [UITextField]() + self.loginStackView.removeAllArrangedSubviews() + self.step2StackView.alpha = 1.0 + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.step3StackView.alpha = 1.0 + self.currentNode?.next { (token: Token?, node, error) in + self.handleNode(token: token, node: node, error: error) + } + } + + } + } + } + + private func updateStatus() { + DispatchQueue.main.async { + if let _ = FRUser.currentUser { + self.statusLabel?.text = "User is authenticated" + self.nextButton.setTitle("Logout", for: .normal) + } + else { + self.statusLabel?.text = "Welcome to Pebble Bank" + self.nextButton.setTitle("Login", for: .normal) + } + } + } + + private func goToNext() { + self.performSegue(withIdentifier: "goToAuthenticated", sender: self) + } + + @objc func handleTap() { + self.view.endEditing(true) + } + + @IBAction func loginButtonPressed(sender: UIButton) { + print("Login button is pressed") + self.hud.textLabel.text = "Authenticating" + self.hud.show(in: self.view) + self.step1StackView.alpha = 1.0 + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.beginAuthentication() + } + } + + func handleNode(token: Token?, node: Node?, error: Error?) { + self.currentNode = node + if let _ = token { + print("User is authenticated") + FRUser.currentUser?.getAccessToken(completion: { user, error in + if error != nil { + print("User unable to get AccessToken with error: \(String(describing: error?.localizedDescription))") + } + DispatchQueue.main.async { + self.step4StackView.alpha = 1.0 + self.hud.dismiss(afterDelay: 1.0) + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.updateStatus() + self.goToNext() + } + } + }) + } + else if let node = node { + print("Node object received, handle the node") + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.hud.dismiss() + for callback: Callback in node.callbacks { + + let textField = UITextField(frame: CGRect.zero) + textField.autocorrectionType = .no + textField.translatesAutoresizingMaskIntoConstraints = false + textField.backgroundColor = .white + textField.textColor = .black + textField.autocapitalizationType = .none + textField.borderStyle = .roundedRect + + if let nameCallback = callback as? NameCallback { + textField.placeholder = nameCallback.prompt + self.loginStackView.addArrangedSubview(textField) + self.textFieldArray.append(textField) + } + if let passwordCallback = callback as? PasswordCallback { + textField.isSecureTextEntry = true + textField.placeholder = passwordCallback.prompt + self.loginStackView.addArrangedSubview(textField) + self.textFieldArray.append(textField) + } + + if let choiceCallback = callback as? ChoiceCallback { + let alert = UIAlertController(title: "Choice", message: choiceCallback.prompt, preferredStyle: .alert) + for choice in choiceCallback.choices { + let action = UIAlertAction(title: choice, style: .default) { (action) in + if let title = action.title, let index = choiceCallback.choices.firstIndex(of: title) { + choiceCallback.setValue(index) + node.next { (token: Token?, node, error) in + self.handleNode(token: token, node: node, error: error) + } + } + } + alert.addAction(action) + } + + DispatchQueue.main.async { + self.present(alert, animated: true, completion: nil) + } + } + + if let authenticationCallback = callback as? WebAuthnAuthenticationCallback { + authenticationCallback.delegate = self + + // Note that the `Node` parameter in `.authenticate()` is an optional parameter. + // If the node is provided, the SDK automatically sets the assertion to the designated HiddenValueCallback + authenticationCallback.authenticate(node: node, usePasskeysIfAvailable: PebbleBankUtilities.usePasskeysIfAvailable) { (assertion) in + // Authentication is successful + // Submit the Node using Node.next() + node.next { (token: Token?, node, error) in + self.handleNode(token: token, node: node, error: error) + } + } onError: { (error) in + // An error occurred during the authentication process + // Submit the Node using Node.next() + let alert = UIAlertController(title: "WebAuthnError", message: "Something went wrong authenticating the device", preferredStyle: .alert) + let okAction = UIAlertAction(title: "OK", style: .default, handler: { (action) in + node.next { (token: Token?, node, error) in + self.handleNode(token: token, node: node, error: error) + } + }) + alert.addAction(okAction) + DispatchQueue.main.async { + self.present(alert, animated: true, completion: nil) + } + } + } + + if let registrationCallback = callback as? WebAuthnRegistrationCallback { + registrationCallback.delegate = self + + // Note that the `Node` parameter in `.register()` is an optional parameter. + // If the node is provided, the SDK automatically sets the error outcome or attestation to the designated HiddenValueCallback + registrationCallback.register(node: node, deviceName: UIDevice.current.name, usePasskeysIfAvailable: PebbleBankUtilities.usePasskeysIfAvailable) { (attestation) in + // Registration is successful + // Submit the Node using Node.next() + node.next { (token: Token?, node, error) in + self.handleNode(token: token, node: node, error: error) + } + } onError: { (error) in + // An error occurred during the registration process + // Submit the Node using Node.next() + let alert = UIAlertController(title: "WebAuthnError", message: "Something went wrong registering the device", preferredStyle: .alert) + let okAction = UIAlertAction(title: "OK", style: .default, handler: { (action) in + node.next { (token: Token?, node, error) in + self.handleNode(token: token, node: node, error: error) + } + }) + alert.addAction(okAction) + DispatchQueue.main.async { + self.present(alert, animated: true, completion: nil) + } + } + } + + } + } + } + else { + print ("Something went wrong: \(String(describing: error))") + } + } +} + +extension LoginViewController: PlatformAuthenticatorRegistrationDelegate, PlatformAuthenticatorAuthenticationDelegate { + func localKeyExistsAndPasskeysAreAvailable() {} + + // MARK: PlatformAuthenticatorRegistrationDelegate + + func excludeCredentialDescriptorConsent(consentCallback: @escaping WebAuthnUserConsentCallback) { + let alert = UIAlertController(title: "Exclude Credentials", message: nil, preferredStyle: .alert) + let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: { (_) in + consentCallback(.reject) + }) + let allowAction = UIAlertAction(title: "Allow", style: .default) { (_) in + consentCallback(.allow) + } + alert.addAction(cancelAction) + alert.addAction(allowAction) + + DispatchQueue.main.async { + self.present(alert, animated: true, completion: nil) + } + } + + func createNewCredentialConsent(keyName: String, rpName: String, rpId: String?, userName: String, userDisplayName: String, consentCallback: @escaping WebAuthnUserConsentCallback) { + let alert = UIAlertController(title: "Create Credentials", message: "KeyName: \(keyName) | Relying Party Name: \(rpName) | User Name: \(userName)", preferredStyle: .alert) + let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: { (_) in + consentCallback(.reject) + }) + let allowAction = UIAlertAction(title: "Allow", style: .default) { (_) in + consentCallback(.allow) + } + alert.addAction(cancelAction) + alert.addAction(allowAction) + + + DispatchQueue.main.async { + self.present(alert, animated: true, completion: nil) + } + } + + // MARK: PlatformAuthenticatorAuthenticationDelegate + func selectCredential(keyNames: [String], selectionCallback: @escaping WebAuthnCredentialsSelectionCallback) { + let actionSheet = UIAlertController(title: "Select Credentials", message: nil, preferredStyle: .actionSheet) + + for keyName in keyNames { + actionSheet.addAction(UIAlertAction(title: keyName, style: .default, handler: { (action) in + selectionCallback(keyName) + })) + } + + actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { (action) in + selectionCallback(nil) + })) + + if actionSheet.popoverPresentationController != nil { + actionSheet.popoverPresentationController?.sourceView = self.view + actionSheet.popoverPresentationController?.sourceRect = self.view.bounds + } + + DispatchQueue.main.async { + self.present(actionSheet, animated: true, completion: nil) + } + } +} diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/PebbleBankUtilities.swift b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/PebbleBankUtilities.swift new file mode 100644 index 00000000..8403e3f9 --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/PebbleBankUtilities.swift @@ -0,0 +1,78 @@ +// +// PebbleBankUtilities.swift +// UnsummitAuthentication +// +// Created by George Bafaloukas on 24/07/2023. +// + +import UIKit +import FRAuth +import FRCore + +class PebbleBankUtilities: NSObject { + static let usePasskeysIfAvailable = true + static let biometricsEnabledKey = "BiometricsEnabled" + static let mainAuthenticationJourney = "Login" + static let biometricsRegistrationJourney = "BlogWebAuthnRegistration" + static let biometricsAuthenticationJourney = "BlogWebAuthnAuthentication" + static let amURL = [AM URL] + static let cookieName = [COOKIE NAME] + static let realm = "alpha" + static let oauthClientId = [CLIENT ID] + static let oauthRedirectURI = "frauth://com.forgerock.ios.frexample" + static let oauthScopes = "openid profile email address" + + static func frCongiguration() -> FROptions { + return FROptions(url: self.amURL, realm: self.realm, cookieName: self.cookieName, authServiceName: self.mainAuthenticationJourney, oauthClientId: self.oauthClientId, oauthRedirectUri: self.oauthRedirectURI, oauthScope: self.oauthScopes) + } + + static func registerRequestInterceptors() { + FRRequestInterceptorRegistry.shared.registerInterceptors( + interceptors: [ + ForceAuthInterceptorBiometricRegistration() + ] + ) + } +} + + +// MARK: - Extensions + +extension UIStackView { + + func removeAllArrangedSubviews() { + + let removedSubviews = arrangedSubviews.reduce([]) { (allSubviews, subview) -> [UIView] in + self.removeArrangedSubview(subview) + return allSubviews + [subview] + } + + // Deactivate all constraints + NSLayoutConstraint.deactivate(removedSubviews.flatMap({ $0.constraints })) + + // Remove the views from self + removedSubviews.forEach({ $0.removeFromSuperview() }) + } +} + +// MARK: - Request Interceptors +class ForceAuthInterceptorBiometricRegistration: RequestInterceptor { + func intercept(request: Request, action: Action) -> Request { + if (action.type == "START_AUTHENTICATE" || action.type == "AUTHENTICATE"), + let payload = action.payload, + let treeName = payload["tree"] as? String, + treeName == PebbleBankUtilities.biometricsRegistrationJourney, + let sessionToken = FRSession.currentSession?.sessionToken?.value + { + var headers = request.headers + headers["Cookie"] = "\(PebbleBankUtilities.cookieName)=\(sessionToken)" + var urlParams = request.urlParams + urlParams["ForceAuth"] = "true" + let newRequest = Request(url: request.url, method: request.method, headers: headers, bodyParams: request.bodyParams, urlParams: urlParams, requestType: request.requestType, responseType: request.responseType, timeoutInterval: request.timeoutInterval) + return newRequest + } + else { + return request + } + } +} diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/SettingsViewController.swift b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/SettingsViewController.swift new file mode 100644 index 00000000..bf275b76 --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/SettingsViewController.swift @@ -0,0 +1,133 @@ +// +// SettingsViewController.swift +// UnsummitAuthentication +// +// Created by George Bafaloukas on 24/07/2023. +// + +import UIKit +import FRAuth +import JGProgressHUD + +class SettingsViewController: UIViewController { + + @IBOutlet weak var faceIDSwitch: UISwitch! + private var currentNode: Node? + private let hud = JGProgressHUD() + + override func viewDidLoad() { + PebbleBankUtilities.registerRequestInterceptors() + self.faceIDSwitch.isOn = UserDefaults.standard.object(forKey: PebbleBankUtilities.biometricsEnabledKey) as? Bool ?? false + } + + @IBAction func changeFaceIDAction(_ sender: UISwitch) { + if sender.isOn { + FRSession.authenticate(authIndexValue: PebbleBankUtilities.biometricsRegistrationJourney) { result, node, error in + self.handleNodes(token: result, node: node, error: error) + } + } else { + UserDefaults.standard.set(nil, forKey: PebbleBankUtilities.biometricsEnabledKey) + } + } + + // MARK: - Private Methods + + func handleNodes(token: Token?, node: Node?, error: Error?) { + if let _ = token { + FRUser.currentUser?.getAccessToken(completion: { user, error in + if error != nil { + print("User unable to get AccessToken with error: \(String(describing: error?.localizedDescription))") + FRUser.currentUser?.logout() + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.hud.dismiss(animated: true) + self.navigationController?.popToRootViewController(animated: true) + return + } + } + DispatchQueue.main.async { + UserDefaults.standard.set(self.faceIDSwitch.isOn, forKey: PebbleBankUtilities.biometricsEnabledKey) + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.hud.dismiss(animated: true) + self.navigationController?.popViewController(animated: true) + } + } + }) + } else if let node = node { + self.currentNode = node + for callback in node.callbacks { + if let passwordCallback = callback as? PasswordCallback { + let alert = UIAlertController(title: "Verify account", message: "Please enter your Password", preferredStyle: .alert) + + DispatchQueue.main.async { + alert.addTextField { (textField) in + textField.placeholder = passwordCallback.prompt + textField.isSecureTextEntry = true + textField.autocorrectionType = .no + textField.autocapitalizationType = .none + } + + if let textfields = alert.textFields, textfields.count > 0 { + let submitAction = UIAlertAction(title: "Next", style: .default) { (_) in + for (index, textField) in textfields.enumerated() { + if let thisCallback = node.callbacks[index] as? SingleValueCallback { + thisCallback.setValue(textField.text) + } + } + node.next { (token: Token?, node, error) in + self.handleNodes(token: token, node: node, error: error) + } + } + alert.addAction(submitAction) + } + self.present(alert, animated: true, completion: nil) + } + } + if let registrationCallback = callback as? WebAuthnRegistrationCallback { + registrationCallback.delegate = self + DispatchQueue.main.async { + // Note that the `Node` parameter in `.register()` is an optional parameter. + // If the node is provided, the SDK automatically sets the error outcome or attestation to the designated HiddenValueCallback + registrationCallback.register(node: node, deviceName: UIDevice.current.name, usePasskeysIfAvailable: PebbleBankUtilities.usePasskeysIfAvailable) { (attestation) in + // Registration is successful + // Submit the Node using Node.next() + node.next { (token: Token?, node, error) in + DispatchQueue.main.async { + self.hud.textLabel.text = "Registering" + self.hud.show(in: self.view) + } + self.handleNodes(token: token, node: node, error: error) + } + } onError: { (error) in + // An error occurred during the registration process + // Submit the Node using Node.next() + let alert = UIAlertController(title: "WebAuthnError", message: "Something went wrong registering the device", preferredStyle: .alert) + let okAction = UIAlertAction(title: "OK", style: .default, handler: { (action) in + node.next { (token: Token?, node, error) in + self.handleNodes(token: token, node: node, error: error) + } + }) + alert.addAction(okAction) + DispatchQueue.main.async { + self.present(alert, animated: true, completion: nil) + } + } + } + } + } + } else { + print("Something went wrong with error: \(String(describing: error?.localizedDescription))") + FRUser.currentUser?.logout() + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.hud.dismiss(animated: true) + self.navigationController?.popToRootViewController(animated: true) + return + } + } + } +} + +extension SettingsViewController: PlatformAuthenticatorRegistrationDelegate { + func excludeCredentialDescriptorConsent(consentCallback: @escaping WebAuthnUserConsentCallback) {} + + func createNewCredentialConsent(keyName: String, rpName: String, rpId: String?, userName: String, userDisplayName: String, consentCallback: @escaping WebAuthnUserConsentCallback) {} +} diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/UnsummitAuthentication.entitlements b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/UnsummitAuthentication.entitlements new file mode 100644 index 00000000..f5214aa5 --- /dev/null +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/UnsummitAuthentication.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + webcredentials:example.com + + + diff --git a/SampleApps/QuickstartExample/Quickstart.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SampleApps/QuickstartExample/Quickstart.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/SampleApps/QuickstartExample/Quickstart.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + From 7fa62677a08ddd300f3ea2f613f01b7adf2496d0 Mon Sep 17 00:00:00 2001 From: George Bafaloukas Date: Tue, 25 Jul 2023 14:55:31 +0100 Subject: [PATCH 2/2] Removing FB test keys --- .../UnsummitAuthentication/Info.plist | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Info.plist b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Info.plist index 0d2ddb2c..d1872b75 100644 --- a/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Info.plist +++ b/SampleApps/PasskeysSample/UnsummitAuthentication/UnsummitAuthentication/Info.plist @@ -54,11 +54,11 @@ CFBundleVersion 1 FacebookAppID - 362269018758347 + FacebookClientToken - f4dce9aa634e6f9029497849c53b7785 + FacebookDisplayName - BioExample + LSApplicationQueriesSchemes fbapi