diff --git a/.gitignore b/.gitignore index 42b4389..d5b60c5 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ playground.xcworkspace # Package.pins # Package.resolved .build/ +.swiftpm # CocoaPods # diff --git a/Example/OktaAuthNative Example.xcodeproj/project.pbxproj b/Example/OktaAuthNative Example.xcodeproj/project.pbxproj index 8416f31..8d5ad39 100644 --- a/Example/OktaAuthNative Example.xcodeproj/project.pbxproj +++ b/Example/OktaAuthNative Example.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 92BEAB922608A2FE0082BC3E /* OktaAuthNative.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92BEAB912608A2FE0082BC3E /* OktaAuthNative.framework */; }; + 92BEAB932608A2FE0082BC3E /* OktaAuthNative.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 92BEAB912608A2FE0082BC3E /* OktaAuthNative.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; FAC5AEE821C7F9A600C3DC91 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC5AEE721C7F9A600C3DC91 /* AppDelegate.swift */; }; FAC5AEEA21C7F9A600C3DC91 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC5AEE921C7F9A600C3DC91 /* ViewController.swift */; }; FAC5AEED21C7F9A600C3DC91 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FAC5AEEB21C7F9A600C3DC91 /* Main.storyboard */; }; @@ -21,6 +23,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 92BEAB932608A2FE0082BC3E /* OktaAuthNative.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -28,6 +31,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 92BEAB912608A2FE0082BC3E /* OktaAuthNative.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = OktaAuthNative.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FAC5AEE421C7F9A600C3DC91 /* OktaAuthNative Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "OktaAuthNative Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; FAC5AEE721C7F9A600C3DC91 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; FAC5AEE921C7F9A600C3DC91 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -42,17 +46,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 92BEAB922608A2FE0082BC3E /* OktaAuthNative.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 92BEAB902608A2FE0082BC3E /* Frameworks */ = { + isa = PBXGroup; + children = ( + 92BEAB912608A2FE0082BC3E /* OktaAuthNative.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; FAC5AEDB21C7F9A600C3DC91 = { isa = PBXGroup; children = ( FAC5AEE621C7F9A600C3DC91 /* Source */, FAC5AEE521C7F9A600C3DC91 /* Products */, + 92BEAB902608A2FE0082BC3E /* Frameworks */, ); sourceTree = ""; }; diff --git a/Example/OktaAuthNative Example.xcodeproj/xcshareddata/xcschemes/OktaAuthNative Example.xcscheme b/Example/OktaAuthNative Example.xcodeproj/xcshareddata/xcschemes/OktaAuthNative Example.xcscheme index 034ec3a..836e972 100644 --- a/Example/OktaAuthNative Example.xcodeproj/xcshareddata/xcschemes/OktaAuthNative Example.xcscheme +++ b/Example/OktaAuthNative Example.xcodeproj/xcshareddata/xcschemes/OktaAuthNative Example.xcscheme @@ -27,28 +27,6 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "NO"> - - - - - - - - - - - - + + + + + + + + + + - - - - - - + + - + @@ -18,85 +16,109 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - + + + + + + + - + - - - - - + - - - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + - @@ -123,6 +145,8 @@ + + @@ -136,7 +160,7 @@ - + diff --git a/Example/Source/ViewController.swift b/Example/Source/ViewController.swift index 9ab49c3..04eef58 100644 --- a/Example/Source/ViewController.swift +++ b/Example/Source/ViewController.swift @@ -22,13 +22,15 @@ class ViewController: UIViewController { self.updateStatus(status: nil) } - @IBOutlet private var stateLabel: UILabel! - @IBOutlet private var usernameField: UITextField! - @IBOutlet private var passwordField: UITextField! - @IBOutlet private var loginButton: UIButton! - @IBOutlet private var cancelButton: UIButton! - @IBOutlet private var activityIndicator: UIActivityIndicatorView! - + @IBOutlet private weak var stateLabel: UILabel! + @IBOutlet private weak var usernameField: UITextField! + @IBOutlet private weak var passwordField: UITextField! + @IBOutlet private weak var loginButton: UIButton! + @IBOutlet private weak var cancelButton: UIButton! + @IBOutlet private weak var activityIndicator: UIActivityIndicatorView! + @IBOutlet private weak var rememberContainer: UIStackView! + @IBOutlet private weak var rememberSwitch: UISwitch! + @IBAction private func loginTapped() { guard let username = usernameField.text, let password = passwordField.text else { return } @@ -36,6 +38,7 @@ class ViewController: UIViewController { OktaAuthSdk.authenticate(with: URL(string: "https://{yourOktaDomain}")!, username: username, password: password, + deviceToken: makeDeviceToken(), onStatusChange: { authStatus in self.handleStatus(status: authStatus) }, @@ -144,9 +147,6 @@ class ViewController: UIViewController { let alert = UIAlertController(title: "Hooray!", message: "We are logged in", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) present(alert, animated: true, completion: nil) - - self.loginButton.isEnabled = false - self.cancelButton.isEnabled = false } func handleError(_ error: OktaError) { @@ -188,6 +188,7 @@ class ViewController: UIViewController { factorRequiredStatus.availableFactors.forEach { factor in alert.addAction(UIAlertAction(title: factor.type.rawValue, style: .default, handler: { _ in factorRequiredStatus.selectFactor(factor, + rememberDevice: self.rememberSwitch.isOn, onStatusChange: { status in self.handleStatus(status: status) }, @@ -275,6 +276,7 @@ class ViewController: UIViewController { alert.addTextField { $0.placeholder = "Code" } alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { _ in guard let code = alert.textFields?[0].text else { return } + status.activateFactor(passCode: code, onStatusChange: { status in self.handleStatus(status: status) @@ -290,7 +292,8 @@ class ViewController: UIViewController { } else { if status.factorResult == nil || status.factorResult == .waiting { - status.activateFactor(passCode: nil, onStatusChange: { status in + status.activateFactor(passCode: nil, + onStatusChange: { status in self.handleStatus(status: status) }, onError: { error in self.handleError(error) @@ -304,7 +307,9 @@ class ViewController: UIViewController { alert.addTextField { $0.placeholder = "Code" } alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak factor] action in guard let code = alert.textFields?[0].text else { return } + factor?.verify(passCode: code, + rememberDevice: self.rememberSwitch.isOn, onStatusChange: { status in self.handleStatus(status: status) }, @@ -323,7 +328,9 @@ class ViewController: UIViewController { alert.addTextField { $0.placeholder = "Code" } alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak factor] action in guard let code = alert.textFields?[0].text else { return } + factor?.verify(passCode: code, + rememberDevice: self.rememberSwitch.isOn, onStatusChange: { status in self.handleStatus(status: status) }, @@ -342,7 +349,9 @@ class ViewController: UIViewController { alert.addTextField { $0.placeholder = "Answer" } alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak factor] action in guard let answer = alert.textFields?[0].text else { return } + factor?.verify(answerToSecurityQuestion: answer, + rememberDevice: self.rememberSwitch.isOn, onStatusChange: { status in self.handleStatus(status: status) }, @@ -357,7 +366,8 @@ class ViewController: UIViewController { } func handlePushChallenge(factor: OktaFactorPush) { - factor.verify(onStatusChange: { (status) in + factor.verify(rememberDevice: self.rememberSwitch.isOn, + onStatusChange: { (status) in if status.factorResult == .waiting { self.updateStatus(status: status) DispatchQueue.main.asyncAfter(deadline:.now() + 5.0) { @@ -387,4 +397,14 @@ class ViewController: UIViewController { }) } } + + private func makeDeviceToken() -> String? { + guard let identifierForVendor = UIDevice.current.identifierForVendor else { + return nil + } + + let maximumDeviceTokenLength = 32 + + return String(identifierForVendor.uuidString.prefix(maximumDeviceTokenLength)) + } } diff --git a/Source/Factors/OktaFactor.swift b/Source/Factors/OktaFactor.swift index 31ec6ed..9d3fa88 100644 --- a/Source/Factors/OktaFactor.swift +++ b/Source/Factors/OktaFactor.swift @@ -150,6 +150,7 @@ open class OktaFactor { public func verify(passCode: String?, answerToSecurityQuestion: String?, + rememberDevice: Bool? = nil, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { guard canVerify() else { @@ -160,6 +161,7 @@ open class OktaFactor { self.verifyFactor(with: verifyLink!, answer: answerToSecurityQuestion, passCode: passCode, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } @@ -175,6 +177,7 @@ open class OktaFactor { self.verifyFactor(with: activationLink!, answer: nil, passCode: passCode, + rememberDevice: nil, onStatusChange: onStatusChange, onError: onError) } @@ -206,16 +209,18 @@ open class OktaFactor { }) } - public func select(onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, + public func select(rememberDevice: Bool? = nil, + onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { - guard canSelect() else { + guard canSelect(), let verifyLink = links?.verify else { onError(OktaError.wrongStatus("Can't find 'verify' link in response")) return } - self.verifyFactor(with: links!.verify!, + self.verifyFactor(with: verifyLink, answer: nil, passCode: nil, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } @@ -233,13 +238,14 @@ open class OktaFactor { func verifyFactor(with link: LinksResponse.Link, answer: String?, passCode: String?, + rememberDevice: Bool? = nil, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { restApi?.verifyFactor(with: link, stateToken: stateToken, answer: answer, passCode: passCode, - rememberDevice: nil, + rememberDevice: rememberDevice, autoPush: nil, completion: { result in self.handleServerResponse(response: result, diff --git a/Source/Factors/OktaFactorCall.swift b/Source/Factors/OktaFactorCall.swift index 8391044..3e10e0f 100644 --- a/Source/Factors/OktaFactorCall.swift +++ b/Source/Factors/OktaFactorCall.swift @@ -33,10 +33,12 @@ open class OktaFactorCall : OktaFactor { } public func verify(passCode: String, + rememberDevice: Bool? = nil, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { super.verify(passCode: passCode, answerToSecurityQuestion: nil, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } diff --git a/Source/Factors/OktaFactorPush.swift b/Source/Factors/OktaFactorPush.swift index 99e16a6..b76535d 100644 --- a/Source/Factors/OktaFactorPush.swift +++ b/Source/Factors/OktaFactorPush.swift @@ -157,15 +157,18 @@ open class OktaFactorPush : OktaFactor { super.activate(passCode: nil, onStatusChange: onStatusChange, onError: onError) } - public func verify(onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, + public func verify(rememberDevice: Bool? = nil, + onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { super.verify(passCode: nil, answerToSecurityQuestion: nil, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } - public func checkFactorResult(onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, + public func checkFactorResult(rememberDevice: Bool? = nil, + onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { guard canActivate() || canVerify() else { onError(OktaError.wrongStatus("Can't find 'poll' link in response")) @@ -182,6 +185,7 @@ open class OktaFactorPush : OktaFactor { self.verifyFactor(with: pollLink!, answer: nil, passCode: nil, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } diff --git a/Source/Factors/OktaFactorQuestion.swift b/Source/Factors/OktaFactorQuestion.swift index ba18f12..148a7ff 100644 --- a/Source/Factors/OktaFactorQuestion.swift +++ b/Source/Factors/OktaFactorQuestion.swift @@ -56,6 +56,7 @@ open class OktaFactorQuestion : OktaFactor { } public func select(answerToSecurityQuestion: String, + rememberDevice: Bool? = nil, onStatusChange: @escaping (OktaAuthStatus) -> Void, onError: @escaping (OktaError) -> Void) { guard canSelect() else { @@ -66,15 +67,18 @@ open class OktaFactorQuestion : OktaFactor { self.verifyFactor(with: links!.verify!, answer: answerToSecurityQuestion, passCode: nil, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } public func verify(answerToSecurityQuestion: String, + rememberDevice: Bool? = nil, onStatusChange: @escaping (OktaAuthStatus) -> Void, onError: @escaping (OktaError) -> Void) { super.verify(passCode: nil, answerToSecurityQuestion: answerToSecurityQuestion, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } diff --git a/Source/Factors/OktaFactorSms.swift b/Source/Factors/OktaFactorSms.swift index 172c621..2f4dd64 100644 --- a/Source/Factors/OktaFactorSms.swift +++ b/Source/Factors/OktaFactorSms.swift @@ -33,10 +33,12 @@ open class OktaFactorSms : OktaFactor { } public func verify(passCode: String, + rememberDevice: Bool? = nil, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { super.verify(passCode: passCode, answerToSecurityQuestion: nil, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } diff --git a/Source/Factors/OktaFactorToken.swift b/Source/Factors/OktaFactorToken.swift index 05d54f5..de65252 100644 --- a/Source/Factors/OktaFactorToken.swift +++ b/Source/Factors/OktaFactorToken.swift @@ -40,18 +40,22 @@ open class OktaFactorToken : OktaFactor { } public func select(passCode: String, + rememberDevice: Bool? = nil, onStatusChange: @escaping (OktaAuthStatus) -> Void, onError: @escaping (OktaError) -> Void) { self.verify(passCode: passCode, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } public func verify(passCode: String, + rememberDevice: Bool? = nil, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { super.verify(passCode: passCode, answerToSecurityQuestion: nil, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } diff --git a/Source/Factors/OktaFactorTotp.swift b/Source/Factors/OktaFactorTotp.swift index fd8072d..b1e31d7 100644 --- a/Source/Factors/OktaFactorTotp.swift +++ b/Source/Factors/OktaFactorTotp.swift @@ -50,20 +50,24 @@ open class OktaFactorTotp : OktaFactor { } public func select(passCode: String, + rememberDevice: Bool? = nil, onStatusChange: @escaping (OktaAuthStatus) -> Void, onError: @escaping (OktaError) -> Void) { self.verifyFactor(with: links!.verify!, answer: nil, passCode: passCode, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } public func verify(passCode: String, + rememberDevice: Bool? = nil, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { super.verify(passCode: passCode, answerToSecurityQuestion: nil, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } diff --git a/Source/OktaAuthSdk.swift b/Source/OktaAuthSdk.swift index 9fee242..14bed05 100644 --- a/Source/OktaAuthSdk.swift +++ b/Source/OktaAuthSdk.swift @@ -17,12 +17,14 @@ public class OktaAuthSdk { public class func authenticate(with url: URL, username: String, password: String?, + deviceToken: String? = nil, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { let unauthenticatedStatus = OktaAuthStatusUnauthenticated(oktaDomain: url) unauthenticatedStatus.authenticate(username: username, password: password ?? "", + deviceToken: deviceToken, onStatusChange:onStatusChange, onError:onError) } diff --git a/Source/Statuses/OktaAuthStatusFactorChallenge.swift b/Source/Statuses/OktaAuthStatusFactorChallenge.swift index 5de3280..2488538 100644 --- a/Source/Statuses/OktaAuthStatusFactorChallenge.swift +++ b/Source/Statuses/OktaAuthStatusFactorChallenge.swift @@ -59,10 +59,12 @@ open class OktaAuthStatusFactorChallenge : OktaAuthStatus { open func verifyFactor(passCode: String?, answerToSecurityQuestion: String?, + rememberDevice: Bool? = nil, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { self.factor.verify(passCode: passCode, answerToSecurityQuestion: answerToSecurityQuestion, + rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } diff --git a/Source/Statuses/OktaAuthStatusFactorRequired.swift b/Source/Statuses/OktaAuthStatusFactorRequired.swift index a571583..3d3bb83 100644 --- a/Source/Statuses/OktaAuthStatusFactorRequired.swift +++ b/Source/Statuses/OktaAuthStatusFactorRequired.swift @@ -45,10 +45,11 @@ open class OktaAuthStatusFactorRequired : OktaAuthStatus { }() open func selectFactor(_ factor: OktaFactor, + rememberDevice: Bool? = nil, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { selectedFactor = factor - factor.select(onStatusChange: onStatusChange, onError: onError) + factor.select(rememberDevice: rememberDevice, onStatusChange: onStatusChange, onError: onError) } override open func cancel(onSuccess: (() -> Void)? = nil, diff --git a/Source/Statuses/OktaAuthStatusUnauthenticated.swift b/Source/Statuses/OktaAuthStatusUnauthenticated.swift index 5194331..be5ca38 100644 --- a/Source/Statuses/OktaAuthStatusUnauthenticated.swift +++ b/Source/Statuses/OktaAuthStatusUnauthenticated.swift @@ -21,11 +21,13 @@ open class OktaAuthStatusUnauthenticated : OktaAuthStatus { open func authenticate(username: String, password: String, + deviceToken: String? = nil, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void) { restApi.primaryAuthentication(username: username, password: password, + deviceToken: deviceToken, deviceFingerprint: nil) { result in self.handleServerResponse(result, diff --git a/Tests/E2E/E2ETests.swift b/Tests/E2E/E2ETests.swift index ff73a4d..9212f30 100644 --- a/Tests/E2E/E2ETests.swift +++ b/Tests/E2E/E2ETests.swift @@ -67,6 +67,29 @@ class E2ETests: XCTestCase { waitForExpectations(timeout: 30.0) } + + func testPrimaryAuthFlowWithDeviceTokenSuccess() { + let ex = expectation(description: "Operation should succeed!") + OktaAuthSdk.authenticate(with: URL(string: urlString)!, + username: primaryAuthUser!.username, + password: primaryAuthUser!.password, + deviceToken: "DeviceToken-1234567", + onStatusChange: { status in + XCTAssertEqual(status.statusType, .success) + + self.verifyBasicInfoForStatus(status: status) + + let successStatus = status as! OktaAuthStatusSuccess + XCTAssertFalse(successStatus.sessionToken!.isEmpty) + ex.fulfill() + }, + onError: { error in + XCTFail(error.description) + ex.fulfill() + }) + + waitForExpectations(timeout: 30.0) + } func testPrimaryAuthFlowFailure() { let ex = expectation(description: "Operation should fail!") @@ -357,6 +380,7 @@ class E2ETests: XCTestCase { let ex = expectation(description: "Operation should fail!") factor.verify(passCode: "1234", answerToSecurityQuestion: nil, + rememberDevice: true, onStatusChange: { status in XCTFail("Unexpected status") @@ -375,7 +399,8 @@ class E2ETests: XCTestCase { func runFactorChallengeForPushFactor(_ factor: OktaFactorPush) { let ex = expectation(description: "Operation should succeed!") - factor.verify(onStatusChange: + factor.verify(rememberDevice: false, + onStatusChange: { status in let factorChallengeStatus = status as? OktaAuthStatusFactorChallenge if let factorChallengeStatus = factorChallengeStatus { @@ -400,6 +425,7 @@ class E2ETests: XCTestCase { func runFactorChallengeForQuestionFactor(_ factor: OktaFactorQuestion) { let ex = expectation(description: "Operation should succeed!") factor.select(answerToSecurityQuestion: answer, + rememberDevice: true, onStatusChange: { status in let successStatus = status as? OktaAuthStatusSuccess diff --git a/Tests/Factors/OktaFactorCallTests.swift b/Tests/Factors/OktaFactorCallTests.swift index 2a961e3..6c60a1b 100644 --- a/Tests/Factors/OktaFactorCallTests.swift +++ b/Tests/Factors/OktaFactorCallTests.swift @@ -170,6 +170,7 @@ class OktaFactorCallTests: OktaFactorTestCase { factor.verify( passCode: "1234", + rememberDevice: true, onStatusChange: { status in XCTAssertEqual(delegate.changedStatus?.statusType, status.statusType) ex.fulfill() @@ -202,6 +203,7 @@ class OktaFactorCallTests: OktaFactorTestCase { factor.verify( passCode: "1234", + rememberDevice: true, onStatusChange: { status in XCTFail("Operation should fail!") ex.fulfill() diff --git a/Tests/Factors/OktaFactorPushTests.swift b/Tests/Factors/OktaFactorPushTests.swift index 356d967..bb898de 100644 --- a/Tests/Factors/OktaFactorPushTests.swift +++ b/Tests/Factors/OktaFactorPushTests.swift @@ -316,6 +316,7 @@ class OktaFactorPushTests: OktaFactorTestCase { let ex = expectation(description: "Operation should succeed!") factor.verify( + rememberDevice: true, onStatusChange: { status in XCTAssertEqual(delegate.changedStatus?.statusType, status.statusType) ex.fulfill() @@ -346,6 +347,7 @@ class OktaFactorPushTests: OktaFactorTestCase { let ex = expectation(description: "Operation should fail!") factor.verify( + rememberDevice: true, onStatusChange: { status in XCTFail("Operation should fail!") ex.fulfill() diff --git a/Tests/Factors/OktaFactorQuestionTests.swift b/Tests/Factors/OktaFactorQuestionTests.swift index 53722fc..95ed826 100644 --- a/Tests/Factors/OktaFactorQuestionTests.swift +++ b/Tests/Factors/OktaFactorQuestionTests.swift @@ -145,6 +145,7 @@ class OktaFactorQuestionTests: OktaFactorTestCase { factor.verify( answerToSecurityQuestion: "test", + rememberDevice: false, onStatusChange: { status in XCTAssertEqual(delegate.changedStatus?.statusType, status.statusType) ex.fulfill() @@ -177,6 +178,7 @@ class OktaFactorQuestionTests: OktaFactorTestCase { factor.verify( answerToSecurityQuestion: "test", + rememberDevice: true, onStatusChange: { status in XCTFail("Operation should fail!") ex.fulfill() diff --git a/Tests/Factors/OktaFactorSmsTests.swift b/Tests/Factors/OktaFactorSmsTests.swift index 4763bc0..4311635 100644 --- a/Tests/Factors/OktaFactorSmsTests.swift +++ b/Tests/Factors/OktaFactorSmsTests.swift @@ -168,6 +168,7 @@ class OktaFactorSmsTests: OktaFactorTestCase { factor.verify( passCode: "1234", + rememberDevice: false, onStatusChange: { status in XCTAssertEqual(delegate.changedStatus?.statusType, status.statusType) ex.fulfill() @@ -200,6 +201,7 @@ class OktaFactorSmsTests: OktaFactorTestCase { factor.verify( passCode: "1234", + rememberDevice: false, onStatusChange: { status in XCTFail("Operation should fail!") ex.fulfill() diff --git a/Tests/Factors/OktaFactorTotpTests.swift b/Tests/Factors/OktaFactorTotpTests.swift index 8876061..5461b13 100644 --- a/Tests/Factors/OktaFactorTotpTests.swift +++ b/Tests/Factors/OktaFactorTotpTests.swift @@ -108,6 +108,7 @@ class OktaFactorTotpTests: OktaFactorTestCase { factor.verify( passCode: "1234", + rememberDevice: true, onStatusChange: { status in XCTAssertEqual(delegate.changedStatus?.statusType, status.statusType) ex.fulfill() @@ -140,6 +141,7 @@ class OktaFactorTotpTests: OktaFactorTestCase { factor.verify( passCode: "1234", + rememberDevice: nil, onStatusChange: { status in XCTFail("Operation should fail!") ex.fulfill() diff --git a/Tests/Statuses/OktaAuthStatusUnauthenticatedTests.swift b/Tests/Statuses/OktaAuthStatusUnauthenticatedTests.swift index 0470cf1..dc99158 100644 --- a/Tests/Statuses/OktaAuthStatusUnauthenticatedTests.swift +++ b/Tests/Statuses/OktaAuthStatusUnauthenticatedTests.swift @@ -26,6 +26,7 @@ class OktaAuthStatusUnauthenticatedTests: XCTestCase { status.authenticate( username: "test", password: "test", + deviceToken: "Device-Token-123", onStatusChange: { status in XCTAssertEqual(AuthStatus.success, status.statusType) ex.fulfill()