Page updated Nov 8, 2023

Enable sign-in with web UI

Prerequisites

Note: Social sign-in (OAuth) functionality is only available in iOS and macOS.

When configuring social sign-in through the Amplify CLI, it's important to exercise caution when designating attributes as "required." Different social identity providers have varied scopes in terms of the information they respond back to Cognito with. User pool attributes that are initially set up as "required" cannot be changed later, and may require you to migrate the users or create a new user pool.

An application with a minimum target of iOS 13.0 and/or macOS 10.15 with Amplify libraries integrated, using Xcode 14.1 or later.

For a full example, please follow the project setup walkthrough.

To use Auth in a macOS project, you'll need to enable the Keychain Sharing capability. In Xcode, navigate to your application target > Signing & Capabilities > + Capability, then select Keychain Sharing.

This capability is required because Auth uses the Data Protection Keychain on macOS as a platform best practice. See TN3137: macOS keychain APIs and implementations for more information on how Keychain works on macOS and the Keychain Sharing entitlement.

For more information on adding capabilities to your application, see Xcode Capabilities.

Configure Auth Category

This library's Cognito plugin currently supports the Authorization Code Grant OAuth Flow.

In terminal, navigate to your project, run amplify add auth, and choose the following options:

1? Do you want to use the default authentication and security configuration?
2 `Default configuration with Social Provider (Federation)`
3? How do you want users to be able to sign in?
4 `Username`
5? Do you want to configure advanced settings?
6 `No, I am done.`
7? What domain name prefix you want us to create for you?
8 `(default)`
9? Enter your redirect signin URI:
10 `myapp://`
11? Do you want to add another redirect signin URI
12 `No`
13? Enter your redirect signout URI:
14 `myapp://`
15? Do you want to add another redirect signout URI
16 `No`
17? Select the social providers you want to configure for your user pool:
18 `<hit enter>`

Once finished, run amplify push to publish your changes.

Update Info.plist

Signin with web UI require the Amplify plugin to show up the signin UI inside a webview. After the signin process is complete it will redirect back to your app. You have to enable this in your app's Info.plist. Right click Info.plist and then choose Open As > Source Code. Add the following entry in the URL scheme:

1<plist version="1.0">
2
3 <dict>
4 <!-- YOUR OTHER PLIST ENTRIES HERE -->
5
6 <!-- ADD AN ENTRY TO CFBundleURLTypes for Cognito Auth -->
7 <!-- IF YOU DO NOT HAVE CFBundleURLTypes, YOU CAN COPY THE WHOLE BLOCK BELOW -->
8 <key>CFBundleURLTypes</key>
9 <array>
10 <dict>
11 <key>CFBundleURLSchemes</key>
12 <array>
13 <string>myapp</string>
14 </array>
15 </dict>
16 </array>
17
18 <!-- ... -->
19 </dict>

When creating a new SwiftUI app using Xcode 13 no longer require configuration files such as the Info.plist. If you are missing this file, click on the project target, under Info, Url Types, and click '+' to add a new URL Type. Add myapp to the URL Schemes. You should see the Info.plist file now with the entry for CFBundleURLSchemes.

Launch Web UI Sign In

Sweet! You're now ready to launch sign in with web UI. The signInWithWebUI api require a presentationAnchor and for an iOS app it will be the main UIWindow of the app. The example code below assume that you are in a UIViewController where you can fetch the UIWindow instance by self.view.window.

1func signInWithWebUI() async {
2 do {
3 let signInResult = try await Amplify.Auth.signInWithWebUI(presentationAnchor: self.view.window!)
4 if signInResult.isSignedIn {
5 print("Sign in succeeded")
6 }
7 } catch let error as AuthError {
8 print("Sign in failed \(error)")
9 } catch {
10 print("Unexpected error: \(error)")
11 }
12}
1func signInWithWebUI() -> AnyCancellable {
2 Amplify.Publisher.create {
3 try await Amplify.Auth.signInWithWebUI(presentationAnchor: self.view.window!)
4 }.sink {
5 if case let .failure(authError) = $0 {
6 print("Sign in failed \(authError)")
7 }
8 }
9 receiveValue: { signInResult in
10 if signInResult.isSignedIn {
11 print("Sign in succeeded")
12 }
13 }
14}

Prefer private session during signIn

Starting Amplify 1.6.0, Amplify.Auth.signInWithWebUI automatically uses ASWebAuthenticationSession internally for iOS 13.0+. For older iOS versions, it will fall back to SFAuthenticationSession. This release also introduces a new preferPrivateSession flag to AWSAuthWebUISignInOptions during the sign in flow. If preferPrivateSession is set to true during sign in, the user will not see a web view displayed when they sign out. preferPrivateSession will set ASWebAuthenticationSession.prefersEphemeralWebBrowserSession internally and the authentication session will be private if the user's preferred browser supports it.

1try await Amplify.Auth.signInWithWebUI(
2 presentationAnchor: self.view.window!,
3 options: .preferPrivateSession()
4) {
5 ...
6}