Skip to content

Commit 38e0513

Browse files
authored
feat(Auth): Hub events for signedIn signedOut and sessionExpire (#457)
1 parent 2ed3157 commit 38e0513

File tree

8 files changed

+161
-1
lines changed

8 files changed

+161
-1
lines changed

Amplify.xcodeproj/project.pbxproj

+4
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@
216216
B4A19DAB24101EEB00DE2E55 /* AuthCategoryBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4A19DAA24101EEB00DE2E55 /* AuthCategoryBehavior.swift */; };
217217
B4A19DAD24101F7100DE2E55 /* AuthSignUpOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4A19DAC24101F7100DE2E55 /* AuthSignUpOperation.swift */; };
218218
B4ADE8F4241063820007E86C /* AuthCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4ADE8F3241063820007E86C /* AuthCategory.swift */; };
219+
B4B1E0E524733687007F3261 /* AuthEventName.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B1E0E424733687007F3261 /* AuthEventName.swift */; };
219220
B4B5CC812457B0690019C783 /* AuthFetchUserAttributesRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B5CC802457B0690019C783 /* AuthFetchUserAttributesRequest.swift */; };
220221
B4B5CC872457B2470019C783 /* AuthUpdateUserAttributeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B5CC862457B2470019C783 /* AuthUpdateUserAttributeRequest.swift */; };
221222
B4B5CC8B2457B32D0019C783 /* AuthConfirmUserAttributeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B5CC8A2457B32D0019C783 /* AuthConfirmUserAttributeRequest.swift */; };
@@ -919,6 +920,7 @@
919920
B4A19DAA24101EEB00DE2E55 /* AuthCategoryBehavior.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthCategoryBehavior.swift; sourceTree = "<group>"; };
920921
B4A19DAC24101F7100DE2E55 /* AuthSignUpOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthSignUpOperation.swift; sourceTree = "<group>"; };
921922
B4ADE8F3241063820007E86C /* AuthCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthCategory.swift; sourceTree = "<group>"; };
923+
B4B1E0E424733687007F3261 /* AuthEventName.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthEventName.swift; sourceTree = "<group>"; };
922924
B4B5CC802457B0690019C783 /* AuthFetchUserAttributesRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthFetchUserAttributesRequest.swift; sourceTree = "<group>"; };
923925
B4B5CC862457B2470019C783 /* AuthUpdateUserAttributeRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUpdateUserAttributeRequest.swift; sourceTree = "<group>"; };
924926
B4B5CC8A2457B32D0019C783 /* AuthConfirmUserAttributeRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthConfirmUserAttributeRequest.swift; sourceTree = "<group>"; };
@@ -1950,6 +1952,7 @@
19501952
B43CD857241147F900BF5A60 /* AuthUser.swift */,
19511953
B493E69224524E8C00D9E521 /* AuthUserAttribute.swift */,
19521954
B493E69024524D3200D9E521 /* DeliveryDestination.swift */,
1955+
B4B1E0E424733687007F3261 /* AuthEventName.swift */,
19531956
);
19541957
path = Models;
19551958
sourceTree = "<group>";
@@ -3971,6 +3974,7 @@
39713974
95DAAB84237F13940028544F /* VoiceType.swift in Sources */,
39723975
FAA2E8C223A00D5800E420EA /* APICategory+Resettable.swift in Sources */,
39733976
B4FA336324105D1800E1C659 /* AuthCategoryPlugin.swift in Sources */,
3977+
B4B1E0E524733687007F3261 /* AuthEventName.swift in Sources */,
39743978
6B33896823AAACC900561E5B /* ReachabilityUpdate.swift in Sources */,
39753979
FAA2E8CC23A02A5400E420EA /* HubCategory+Resettable.swift in Sources */,
39763980
2142099823721F4400FA140C /* RESTOperationRequest.swift in Sources */,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//
2+
// Copyright 2018-2020 Amazon.com,
3+
// Inc. or its affiliates. All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import Foundation
9+
10+
public extension HubPayload.EventName.Auth {
11+
12+
static let signedIn = "Auth.signedIn"
13+
14+
static let signedOut = "Auth.signedOut"
15+
16+
static let sessionExpired = "Auth.sessionExpired"
17+
}

AmplifyPlugins/Auth/AWSAuthPlugin.xcodeproj/project.pbxproj

+16
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
AACCE0421C5E26DF52717461 /* Pods_HostApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 234C2AFA9205B1766FB8E090 /* Pods_HostApp.framework */; };
1414
B40208E224627290009CF25A /* AuthResetPasswordRequest+Validate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40208E124627290009CF25A /* AuthResetPasswordRequest+Validate.swift */; };
1515
B40208E42462729F009CF25A /* AuthConfirmResetPasswordRequest+Validate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40208E32462729F009CF25A /* AuthConfirmResetPasswordRequest+Validate.swift */; };
16+
B402F77724734142006C8A1C /* AuthHubEventBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = B402F77624734142006C8A1C /* AuthHubEventBehavior.swift */; };
1617
B416E2A3244EA3F500E8E96D /* AWSAuthFetchSessionOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B416E2A2244EA3F500E8E96D /* AWSAuthFetchSessionOperation.swift */; };
1718
B416E2AF244EAE6800E8E96D /* AWSAuthCognitoSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = B416E2AE244EAE6800E8E96D /* AWSAuthCognitoSession.swift */; };
1819
B416E2B3244F8E8700E8E96D /* AWSCognitoUserPoolTokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = B416E2B2244F8E8700E8E96D /* AWSCognitoUserPoolTokens.swift */; };
@@ -80,6 +81,7 @@
8081
B49FAA5124478775001868ED /* AuthenticationProviderAdapter+SignIn.swift in Sources */ = {isa = PBXBuildFile; fileRef = B49FAA5024478775001868ED /* AuthenticationProviderAdapter+SignIn.swift */; };
8182
B4A65ADB244E4C0E003A8F57 /* AuthErrorHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4A65ADA244E4C0E003A8F57 /* AuthErrorHelper.swift */; };
8283
B4A65ADF244E4D2D003A8F57 /* AWSCognitoAuthError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4A65ADE244E4D2D003A8F57 /* AWSCognitoAuthError.swift */; };
84+
B4B1E0E824733907007F3261 /* AuthHubEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B1E0E724733907007F3261 /* AuthHubEventHandler.swift */; };
8385
B4B5CC9C2457B9820019C783 /* AWSAuthUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B5CC9B2457B9820019C783 /* AWSAuthUser.swift */; };
8486
B4B5CC9E24586C9E0019C783 /* AuthUserServiceBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B5CC9D24586C9E0019C783 /* AuthUserServiceBehavior.swift */; };
8587
B4B5CCAB2458AE2B0019C783 /* AuthUserServiceAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B5CCAA2458AE2B0019C783 /* AuthUserServiceAdapter.swift */; };
@@ -140,6 +142,7 @@
140142
94AE978618BF1C30FD808FB6 /* Pods-HostApp-AWSAuthPluginIntegrationTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HostApp-AWSAuthPluginIntegrationTests.debug.xcconfig"; path = "Target Support Files/Pods-HostApp-AWSAuthPluginIntegrationTests/Pods-HostApp-AWSAuthPluginIntegrationTests.debug.xcconfig"; sourceTree = "<group>"; };
141143
B40208E124627290009CF25A /* AuthResetPasswordRequest+Validate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AuthResetPasswordRequest+Validate.swift"; sourceTree = "<group>"; };
142144
B40208E32462729F009CF25A /* AuthConfirmResetPasswordRequest+Validate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AuthConfirmResetPasswordRequest+Validate.swift"; sourceTree = "<group>"; };
145+
B402F77624734142006C8A1C /* AuthHubEventBehavior.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthHubEventBehavior.swift; sourceTree = "<group>"; };
143146
B416E2A2244EA3F500E8E96D /* AWSAuthFetchSessionOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSAuthFetchSessionOperation.swift; sourceTree = "<group>"; };
144147
B416E2AE244EAE6800E8E96D /* AWSAuthCognitoSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSAuthCognitoSession.swift; sourceTree = "<group>"; };
145148
B416E2B2244F8E8700E8E96D /* AWSCognitoUserPoolTokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSCognitoUserPoolTokens.swift; sourceTree = "<group>"; };
@@ -211,6 +214,7 @@
211214
B49FAA5024478775001868ED /* AuthenticationProviderAdapter+SignIn.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AuthenticationProviderAdapter+SignIn.swift"; sourceTree = "<group>"; };
212215
B4A65ADA244E4C0E003A8F57 /* AuthErrorHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthErrorHelper.swift; sourceTree = "<group>"; };
213216
B4A65ADE244E4D2D003A8F57 /* AWSCognitoAuthError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AWSCognitoAuthError.swift; sourceTree = "<group>"; };
217+
B4B1E0E724733907007F3261 /* AuthHubEventHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthHubEventHandler.swift; sourceTree = "<group>"; };
214218
B4B5CC9B2457B9820019C783 /* AWSAuthUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSAuthUser.swift; sourceTree = "<group>"; };
215219
B4B5CC9D24586C9E0019C783 /* AuthUserServiceBehavior.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUserServiceBehavior.swift; sourceTree = "<group>"; };
216220
B4B5CCAA2458AE2B0019C783 /* AuthUserServiceAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthUserServiceAdapter.swift; sourceTree = "<group>"; };
@@ -382,6 +386,7 @@
382386
B49FAA2324451A22001868ED /* AWSAuthPlugin+Reset.swift */,
383387
B41B895F24672AB40092F96D /* ClientBehavior */,
384388
B49FAA3E24457039001868ED /* Dependency */,
389+
B4B1E0E6247338BF007F3261 /* HubEvents */,
385390
B439F2AC24488CFD00C30CBB /* Models */,
386391
B49FAA4724458011001868ED /* Operations */,
387392
B439F2A92448835700C30CBB /* Request */,
@@ -523,6 +528,15 @@
523528
path = Error;
524529
sourceTree = "<group>";
525530
};
531+
B4B1E0E6247338BF007F3261 /* HubEvents */ = {
532+
isa = PBXGroup;
533+
children = (
534+
B4B1E0E724733907007F3261 /* AuthHubEventHandler.swift */,
535+
B402F77624734142006C8A1C /* AuthHubEventBehavior.swift */,
536+
);
537+
path = HubEvents;
538+
sourceTree = "<group>";
539+
};
526540
B4B5CCAC2458AF390019C783 /* UserOperations */ = {
527541
isa = PBXGroup;
528542
children = (
@@ -1164,10 +1178,12 @@
11641178
B493E6A82454CF6A00D9E521 /* AWSAuthSocialWebUISignInOperation.swift in Sources */,
11651179
B493E6A62454CEC700D9E521 /* AWSAuthWebUISignInOperation.swift in Sources */,
11661180
B41B896324672AB40092F96D /* AWSAuthPlugin+DeviceBehavior.swift in Sources */,
1181+
B402F77724734142006C8A1C /* AuthHubEventBehavior.swift in Sources */,
11671182
B49FAA2424451A22001868ED /* AWSAuthPlugin+Reset.swift in Sources */,
11681183
B4B5CC9C2457B9820019C783 /* AWSAuthUser.swift in Sources */,
11691184
B46884222460AB1600221268 /* AWSAuthRememberDeviceOperation.swift in Sources */,
11701185
B4A65ADF244E4D2D003A8F57 /* AWSCognitoAuthError.swift in Sources */,
1186+
B4B1E0E824733907007F3261 /* AuthHubEventHandler.swift in Sources */,
11711187
B49FAA302445275F001868ED /* AuthPluginErrorConstants.swift in Sources */,
11721188
B452F1E72450F9160069F7FA /* AWSAuthConfirmSignUpOptions.swift in Sources */,
11731189
);

AmplifyPlugins/Auth/AWSAuthPlugin/AWSAuthPlugin+Configure.swift

+5-1
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,12 @@ extension AWSAuthPlugin {
3434
let authorizationProvider = AuthorizationProviderAdapter(awsMobileClient: awsMobileClient)
3535
let userService = AuthUserServiceAdapter(awsMobileClient: awsMobileClient)
3636
let deviceService = AuthDeviceServiceAdapter(awsMobileClient: awsMobileClient)
37+
let hubEventHandler = AuthHubEventHandler()
3738
configure(authenticationProvider: authenticationProvider,
3839
authorizationProvider: authorizationProvider,
3940
userService: userService,
40-
deviceService: deviceService)
41+
deviceService: deviceService,
42+
hubEventHandler: hubEventHandler)
4143
} catch let authError as AuthError {
4244
throw authError
4345
} catch {
@@ -65,11 +67,13 @@ extension AWSAuthPlugin {
6567
authorizationProvider: AuthorizationProviderBehavior,
6668
userService: AuthUserServiceBehavior,
6769
deviceService: AuthDeviceServiceBehavior,
70+
hubEventHandler: AuthHubEventBehavior,
6871
queue: OperationQueue = OperationQueue()) {
6972
self.authenticationProvider = authenticationProvider
7073
self.authorizationProvider = authorizationProvider
7174
self.userService = userService
7275
self.deviceService = deviceService
76+
self.hubEventHandler = hubEventHandler
7377
self.queue = queue
7478
}
7579
}

AmplifyPlugins/Auth/AWSAuthPlugin/AWSAuthPlugin+Reset.swift

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ extension AWSAuthPlugin {
2525
authenticationProvider = nil
2626
userService = nil
2727
deviceService = nil
28+
hubEventHandler = nil
2829
onComplete()
2930
}
3031
}

AmplifyPlugins/Auth/AWSAuthPlugin/AWSAuthPlugin.swift

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ final public class AWSAuthPlugin: AuthCategoryPlugin {
2929
/// Operations related to the auth device
3030
var deviceService: AuthDeviceServiceBehavior!
3131

32+
/// Handles different auth event send through hub
33+
var hubEventHandler: AuthHubEventBehavior!
34+
3235
/// The unique key of the plugin within the auth category.
3336
public var key: PluginKey {
3437
return "awsCognitoAuthPlugin"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//
2+
// Copyright 2018-2020 Amazon.com,
3+
// Inc. or its affiliates. All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import Foundation
9+
10+
protocol AuthHubEventBehavior {
11+
12+
func sendUserSignedInEvent()
13+
14+
func sendUserSignedOutEvent()
15+
16+
func sendSessionExpiredEvent()
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
//
2+
// Copyright 2018-2020 Amazon.com,
3+
// Inc. or its affiliates. All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import Amplify
9+
import AWSPluginsCore
10+
11+
class AuthHubEventHandler: AuthHubEventBehavior {
12+
13+
var lastSendEventName: HubPayloadEventName?
14+
15+
init() {
16+
setupHubEvents()
17+
}
18+
19+
func sendUserSignedInEvent() {
20+
dispatchAuthEvent(HubPayload.EventName.Auth.signedIn)
21+
}
22+
23+
func sendUserSignedOutEvent() {
24+
dispatchAuthEvent(HubPayload.EventName.Auth.signedOut)
25+
}
26+
27+
func sendSessionExpiredEvent() {
28+
dispatchAuthEvent(HubPayload.EventName.Auth.sessionExpired)
29+
}
30+
31+
private func setupHubEvents() {
32+
33+
_ = Amplify.Hub.listen(to: .auth) {[weak self] payload in
34+
switch payload.eventName {
35+
36+
case HubPayload.EventName.Auth.signIn:
37+
guard let event = payload.data as? AWSAuthSignInOperation.OperationResult,
38+
case let .success(result) = event else {
39+
return
40+
}
41+
self?.handleSignInEvent(result)
42+
43+
case HubPayload.EventName.Auth.confirmSignIn:
44+
guard let event = payload.data as? AWSAuthConfirmSignInOperation.OperationResult,
45+
case let .success(result) = event else {
46+
return
47+
}
48+
self?.handleSignInEvent(result)
49+
50+
case HubPayload.EventName.Auth.signOut:
51+
guard let event = payload.data as? AWSAuthSignOutOperation.OperationResult,
52+
case .success(_) = event else {
53+
return
54+
}
55+
self?.sendUserSignedOutEvent()
56+
57+
case HubPayload.EventName.Auth.fetchSession:
58+
guard let event = payload.data as? AWSAuthFetchSessionOperation.OperationResult,
59+
case let .success(result) = event else {
60+
return
61+
}
62+
self?.handleSessionEvent(result)
63+
64+
default:
65+
break
66+
}
67+
}
68+
}
69+
70+
private func handleSignInEvent(_ signInResult: AuthSignInResult) {
71+
guard signInResult.isSignedIn else {
72+
return
73+
}
74+
sendUserSignedInEvent()
75+
}
76+
77+
private func handleSessionEvent(_ sessionResult: AuthSession) {
78+
guard let tokensProvider = sessionResult as? AuthCognitoTokensProvider,
79+
case let .failure(authError) = tokensProvider.getCognitoTokens() else {
80+
return
81+
}
82+
83+
guard case let .service(_, _, cognitoError as AWSCognitoAuthError) = authError,
84+
cognitoError == .sessionExpired else {
85+
return
86+
}
87+
88+
sendSessionExpiredEvent()
89+
}
90+
91+
private func dispatchAuthEvent(_ eventName: String) {
92+
if eventName != lastSendEventName {
93+
lastSendEventName = eventName
94+
Amplify.Hub.dispatch(to: .auth, payload: HubPayload(eventName: eventName))
95+
}
96+
}
97+
98+
}

0 commit comments

Comments
 (0)