Skip to content

chore(auth): add swift passwordless sign up/auto sign in changes #8128

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 25, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -553,7 +553,102 @@ Your application's users can also sign up using passwordless methods. To learn m
</InlineFilter>
<InlineFilter filters={["swift"]}>

{/* */}
<BlockSwitcher>

<Block name="Async/Await">

```swift
// Sign up using an phone number
func signUp(username: String, phonenumber: String) async {
let userAttributes = [
AuthUserAttribute(.phoneNumber, value: phonenumber)
]
let options = AuthSignUpRequest.Options(userAttributes: userAttributes)
do {
let signUpResult = try await Amplify.Auth.signUp(
username: username,
options: options
)
if case let .confirmUser(deliveryDetails, _, userId) = signUpResult.nextStep {
print("Delivery details \(String(describing: deliveryDetails)) for userId: \(String(describing: userId)))")
} else {
print("SignUp Complete")
}
} catch let error as AuthError {
print("An error occurred while registering a user \(error)")
} catch {
print("Unexpected error: \(error)")
}
}

// Confirm sign up with the OTP received
func confirmSignUp(for username: String, with confirmationCode: String) async {
do {
let confirmSignUpResult = try await Amplify.Auth.confirmSignUp(
for: username,
confirmationCode: confirmationCode
)
print("Confirm sign up result completed: \(confirmSignUpResult.isSignUpComplete)")
} catch let error as AuthError {
print("An error occurred while confirming sign up \(error)")
} catch {
print("Unexpected error: \(error)")
}
}
```

</Block>

<Block name="Combine">

```swift
// Sign up using a phone number
func signUp(username: String, phonenumber: String) -> AnyCancellable {
let userAttributes = [
AuthUserAttribute(.phoneNumber, value: phonenumber)
]
let options = AuthSignUpRequest.Options(userAttributes: userAttributes)
let sink = Amplify.Publisher.create {
try await Amplify.Auth.signUp(
username: username,
options: options
)
}.sink {
if case let .failure(authError) = $0 {
print("An error occurred while registering a user \(authError)")
}
}
receiveValue: { signUpResult in
if case let .confirmUser(deliveryDetails, _, userId) = signUpResult.nextStep {
print("Delivery details \(String(describing: deliveryDetails)) for userId: \(String(describing: userId)))")
} else {
print("SignUp Complete")
}
}
return sink
}

// Confirm sign up with the OTP received
func confirmSignUp(for username: String, with confirmationCode: String) -> AnyCancellable {
Amplify.Publisher.create {
try await Amplify.Auth.confirmSignUp(
for: username,
confirmationCode: confirmationCode
)
}.sink {
if case let .failure(authError) = $0 {
print("An error occurred while confirming sign up \(authError)")
}
}
receiveValue: { _ in
print("Confirm signUp succeeded")
}
}
```

</Block>

</BlockSwitcher>

</InlineFilter>

Expand All @@ -578,7 +673,102 @@ Your application's users can also sign up using passwordless methods. To learn m
</InlineFilter>
<InlineFilter filters={["swift"]}>

{/* */}
<BlockSwitcher>

<Block name="Async/Await">

```swift
// Sign up using an email
func signUp(username: String, email: String) async {
let userAttributes = [
AuthUserAttribute(.email, value: email)
]
let options = AuthSignUpRequest.Options(userAttributes: userAttributes)
do {
let signUpResult = try await Amplify.Auth.signUp(
username: username,
options: options
)
if case let .confirmUser(deliveryDetails, _, userId) = signUpResult.nextStep {
print("Delivery details \(String(describing: deliveryDetails)) for userId: \(String(describing: userId)))")
} else {
print("SignUp Complete")
}
} catch let error as AuthError {
print("An error occurred while registering a user \(error)")
} catch {
print("Unexpected error: \(error)")
}
}

// Confirm sign up with the OTP received
func confirmSignUp(for username: String, with confirmationCode: String) async {
do {
let confirmSignUpResult = try await Amplify.Auth.confirmSignUp(
for: username,
confirmationCode: confirmationCode
)
print("Confirm sign up result completed: \(confirmSignUpResult.isSignUpComplete)")
} catch let error as AuthError {
print("An error occurred while confirming sign up \(error)")
} catch {
print("Unexpected error: \(error)")
}
}
```

</Block>

<Block name="Combine">

```swift
// Sign up using an email
func signUp(username: String, email: String) -> AnyCancellable {
let userAttributes = [
AuthUserAttribute(.email, value: email)
]
let options = AuthSignUpRequest.Options(userAttributes: userAttributes)
let sink = Amplify.Publisher.create {
try await Amplify.Auth.signUp(
username: username,
options: options
)
}.sink {
if case let .failure(authError) = $0 {
print("An error occurred while registering a user \(authError)")
}
}
receiveValue: { signUpResult in
if case let .confirmUser(deliveryDetails, _, userId) = signUpResult.nextStep {
print("Delivery details \(String(describing: deliveryDetails)) for userId: \(String(describing: userId)))")
} else {
print("SignUp Complete")
}
}
return sink
}

// Confirm sign up with the OTP received
func confirmSignUp(for username: String, with confirmationCode: String) -> AnyCancellable {
Amplify.Publisher.create {
try await Amplify.Auth.confirmSignUp(
for: username,
confirmationCode: confirmationCode
)
}.sink {
if case let .failure(authError) = $0 {
print("An error occurred while confirming sign up \(authError)")
}
}
receiveValue: { _ in
print("Confirm signUp succeeded")
}
}
```

</Block>

</BlockSwitcher>

</InlineFilter>

Expand Down Expand Up @@ -607,3 +797,93 @@ Your application's users can also sign up using passwordless methods. To learn m

</InlineFilter>

### Auto Sign In

{/* blurb with supplemental information about auto sign in */}

<InlineFilter filters={["angular", "javascript", "nextjs", "react", "react-native", "vue"]}>

{/* */}

</InlineFilter>
<InlineFilter filters={["android"]}>

{/* */}

</InlineFilter>
<InlineFilter filters={["flutter"]}>

{/* */}

</InlineFilter>
<InlineFilter filters={["swift"]}>

<BlockSwitcher>

<Block name="Async/Await">

```swift
// Confirm sign up with the OTP received and auto sign in
func confirmSignUp(for username: String, with confirmationCode: String) async {
do {
let confirmSignUpResult = try await Amplify.Auth.confirmSignUp(
for: username,
confirmationCode: confirmationCode
)
if case .completeAutoSignIn(let session) = confirmSignUpResult.nextStep {
let autoSignInResult = try await Amplify.Auth.autoSignIn()
print("Auto sign in result: \(autoSignInResult.isSignedIn)")
} else {
print("Confirm sign up result completed: \(confirmSignUpResult.isSignUpComplete)")
}
} catch let error as AuthError {
print("An error occurred while confirming sign up \(error)")
} catch {
print("Unexpected error: \(error)")
}
}
```

</Block>

<Block name="Combine">

```swift
// Confirm sign up with the OTP received and auto sign in
func confirmSignUp(for username: String, with confirmationCode: String) -> AnyCancellable {
Amplify.Publisher.create {
try await Amplify.Auth.confirmSignUp(
for: username,
confirmationCode: confirmationCode
)
}.sink {
if case let .failure(authError) = $0 {
print("An error occurred while confirming sign up \(authError)")
}
}
receiveValue: { confirmSignUpResult in
if case .completeAutoSignIn = confirmSignUpResult.nextStep {
let _ = Amplify.Publisher.create {
try await Amplify.Auth.autoSignIn()
}.sink {
if case let .failure(authError) = $0 {
print("Auto Sign in failed \(authError)")
}
}
receiveValue: { autoSignInResult in
if autoSignInResult.isSignedIn {
print("Auto Sign in succeeded")
}
}
} else {
print("Confirm sign up result completed: \(confirmSignUpResult.isSignUpComplete)")
}
}
}
```

</Block>

</BlockSwitcher>

</InlineFilter>