-
Notifications
You must be signed in to change notification settings - Fork 210
/
Copy pathAWSAuthRememberDeviceTask.swift
73 lines (64 loc) · 2.59 KB
/
AWSAuthRememberDeviceTask.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//
// Copyright Amazon.com Inc. or its affiliates.
// All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//
import Foundation
import Amplify
import AWSPluginsCore
import ClientRuntime
import AWSCognitoIdentityProvider
class AWSAuthRememberDeviceTask: AuthRememberDeviceTask {
private let request: AuthRememberDeviceRequest
private let authStateMachine: AuthStateMachine
private let environment: AuthEnvironment
private let taskHelper: AWSAuthTaskHelper
var eventName: HubPayloadEventName {
HubPayload.EventName.Auth.rememberDeviceAPI
}
init(_ request: AuthRememberDeviceRequest,
authStateMachine: AuthStateMachine,
environment: AuthEnvironment) {
self.request = request
self.authStateMachine = authStateMachine
self.environment = environment
self.taskHelper = AWSAuthTaskHelper(authStateMachine: authStateMachine)
}
func execute() async throws {
do {
await taskHelper.didStateMachineConfigured()
let accessToken = try await taskHelper.getAccessToken()
let username = try await getCurrentUsername()
try await rememberDevice(with: accessToken, username: username)
} catch let error as AuthErrorConvertible {
throw error.authError
} catch let error as AuthError {
throw error
} catch let error {
throw AuthError.unknown("Unable to execute auth task", error)
}
}
func getCurrentUsername() async throws -> String {
let authState = await authStateMachine.currentState
if case .configured(let authenticationState, _) = authState,
case .signedIn(let signInData) = authenticationState {
return signInData.username
}
throw AuthError.unknown("Unable to get username for the signedIn user")
}
private func rememberDevice(with accessToken: String, username: String) async throws {
let userPoolService = try environment.cognitoUserPoolFactory()
let deviceMetadata = await DeviceMetadataHelper.getDeviceMetadata(
for: username,
with: environment)
if case .metadata(let data) = deviceMetadata {
let input = UpdateDeviceStatusInput(accessToken: accessToken,
deviceKey: data.deviceKey,
deviceRememberedStatus: .remembered)
_ = try await userPoolService.updateDeviceStatus(input: input)
} else {
throw AuthError.unknown("Unable to get device metadata")
}
}
}