Securing Your iOS App: How to Implement User Authentication with AWS Cognito

Securing Your iOS App: How to Implement User Authentication with AWS Cognito

In today's modern digital age, security has risen to the top of the priority list for any application. As an iOS app developer, ensuring  that your iOS app is secure and shielded from any unauthorized access is crucial. One approach to accomplishing this is through user authentication, which helps confirm the identity of users or resources attempting to access your app's services or resources. Yet starting from scratch with user authentication can be difficult and time-consuming.

Fortunately, with Amazon Cognito, an AWS service, adding user authentication and permission to your iOS app is simple and effective. In this guide, we will examine how to incorporate user authentication using AWS Cognito into your iOS app.

 

What is AWS Authentication?

AWS authentication

AWS Authentication is the process of verifying the identity of users or resources who attempt to access AWS resources or services. AWS offers a variety of authentication options, such as username and password, multi-factor authentication, and federated identity management.

Amazon Cognito is an AWS service that provides user sign-up, sign-in, and access control. It allows developers to easily add user authentication and authorization to their mobile and web applications. The features of AWS Cognito include:

  • Social identity provider integration, customizable authentication flows, multi-factor authentication, and user management. 
  • Providing a secure and scalable user directory.
  • Integrating with other AWS services such as Lambda, API Gateway, and S3.

 

Here is a brief overview of the steps involved in integrating AWS Authentication using Cognito into iOS:

  1. Create a User Pool in Amazon Cognito
  2. Create an App Client within the User Pool
  3. Add the AWS SDK for iOS to your Xcode project
  4. Use the AWS SDK to interact with the User Pool and authenticate users in your app
  5. Handle authentication tokens in your app to control access to your AWS resources
  6. (Optional) Enhance security with Multi-Factor Authentication (MFA) in Cognito
  7. (Optional) Customize the authentication flow using Cognito triggers and AWS Lambda
  8. Test and debug your app to ensure that authentication is working as expected

These are just the high-level steps, and each step requires specific configuration and implementation details. It's important to refer to the AWS documentation and other resources to ensure that you are implementing AWS Authentication with Cognito correctly and securely.

 

Section 1: Setting up Cognito

AWS Cognito logo

 

To create a new user pool in Amazon Cognito, follow these steps:

  1. Sign in to the AWS Management Console and navigate to the Amazon Cognito service.
  2. Click on "Manage User Pools" to create a new user pool.
  3. Enter a name for your user pool and select the region where it will be located.
  4. Configure the attributes for your user pool. You can choose from predefined attributes, such as email or phone number, or create your own custom attributes.
  5. Specify the policies for your user pool. This includes setting a password policy, configuring account recovery settings, and defining user sign-up and sign-in options.
  6. Customize the email and SMS messages that Cognito sends to users during account verification and password reset processes.
  7. Review and save your user pool settings.

Once you have created your user pool, you can add app clients, define groups and roles, and configure other advanced settings. You can also integrate your user pool with other AWS services, such as Lambda or API Gateway, to control access to your resources. It's important to follow the AWS security best practices when configuring your user pool to ensure that your app is secure and your users' data is protected.

 

To configure the user pool settings in Amazon Cognito, follow these steps:

To carry on user authentication using AWS cognito, you need to configure the user pool settings:

1. Sign in to the AWS Management Console and navigate to the Amazon Cognito service.

2. Click on "Manage User Pools" to view your user pools.

3. Select the user pool you want to configure and click on "General settings."

4. In the "General settings" section, you can configure the following options:

  • Pool name: The name of your user pool.
  • Pool ID: The unique identifier for your user pool.
  • AWS region: The region where your user pool is located.
  • Multi-factor authentication (MFA): Enable or disable MFA for your user pool.

5. Click on "Policies" to configure the password policy, account recovery settings, and user sign-up and sign-in options.

6. In the "Policies" section, you can configure the following options:

  • Password policy: The minimum password length, character requirements, and other password settings.
  • Account recovery settings: The method used to recover accounts, such as email or phone number verification.
  • User sign-up and sign-in options: The methods users can use to sign up and sign in to your app, such as email, phone number, or social identity providers.

7. Click on "Attributes" to configure the user attributes for your user pool.

8. In the "Attributes" section, you can select from predefined attributes or create custom attributes for your user pool. These attributes can be used to collect additional user information, such as address or date of birth.

9. Click on "Devices" to configure device tracking for your user pool.

10. In the "Devices" section, you can enable or disable device tracking and configure the settings for device registration and tracking.

11. Click on "Apps" to add app clients and configure their settings.

12. In the "Apps" section, you can add app clients to your user pool and configure their settings, such as OAuth 2.0 scopes, callback URLs, and user pool access.

13. Click on "Triggers" to configure the user pool triggers and enable custom workflows.

14. In the "Triggers" section, you can enable custom workflows by configuring triggers for events such as user sign-up, authentication, and password reset.

15. Click on "Review" to review and save your user pool settings.

By following these steps, you can configure the user pool settings for your Amazon Cognito user pool and customize it to meet your specific needs.

 

To create an app client and configure its settings in Amazon Cognito, follow these steps:

1. Sign in to the AWS Management Console and navigate to the Amazon Cognito service.

2. Click on "Manage User Pools" to view your user pools.

3. Select the user pool you want to add an app client to and click on "App clients."

4. Click on "Add an app client" and enter a name for your app client.

5. Choose the app client settings you want to configure, such as:

  • Enable username password based authentication
  • Enable sign-in API for server-based authentication (APIs)
  • Enable OAuth 2.0 flows
  • Enable access tokens
  • Enable ID tokens
  • Enable refresh tokens

6. Click on "Create app client" to create your app client.

7. After creating the app client, click on "App client settings" to configure additional settings, such as callback URLs, logout URLs, and allowed OAuth scopes.

8. In the "App client settings" section, you can configure the following options:

  • App client ID: The unique identifier for your app client.
  • App client name: The name of your app client.
  • Refresh token expiration: The time period before a refresh token expires.
  • Allowed OAuth scopes: The scopes that your app client is allowed to access.
  • Callback URLs: The URLs that Cognito should redirect users to after authentication.
  • Logout URLs: The URLs that Cognito should redirect users to after logout.

9. Click on "Save changes" to save your app client settings.

By following these steps, you can create an app client and configure its settings in Amazon Cognito. Once you have created your app client, you can use the SDKs provided by AWS to integrate it with your iOS app and provide authentication and authorization services for your users.

 

Section 2: Implementing the Authentication Flow in iOS

 To set up the AWS SDK for iOS, follow these steps:

1. Download the AWS SDK for iOS from the AWS Mobile SDKs page on the AWS website.

2. Extract the downloaded ZIP file to your project directory.

3. In Xcode, select your project in the project navigator, and then select the "General" tab.

4. Drag and drop the AWS frameworks into the "Frameworks, Libraries, and Embedded Content" section of your project.

5. In the "Build Phases" tab of your project, add the AWS framework headers to your project's header search paths.

6. Create an AWS configuration file named "awsconfiguration.json" in your project's directory. This file contains your AWS account information and credentials.

7. Add the following code to your app's AppDelegate file to initialize the AWS SDK with your configuration:

import AWSMobileClient

 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: nil)

    let mobileClient = AWSMobileClient(configuration: configuration)

    AWSDDLog.add(AWSDDTTYLogger.sharedInstance)

    return true

}

This code initializes the AWS SDK with your AWS account information and credentials, and configures the SDK to use the AWS region of your choice.

8. Import the AWSMobileClient framework in your app's view controllers and use the provided methods to interact with Amazon Cognito and perform authentication and authorization operations.

By following these steps, you can set up the AWS SDK for iOS and integrate it with your app to provide access to AWS services and perform operations such as authentication, data storage, and messaging.

9. To authenticate a user using Cognito on iOS, you can use the AWSMobileClient framework provided by AWS. The AWSMobileClient framework includes methods for performing user authentication and authorization operations with Amazon Cognito.

 

Here are the basic steps to authenticate a user using Cognito on iOS:

1. In your app's view controller, import the AWSMobileClient framework.

import AWSMobileClient

2. Initialize the AWSMobileClient in your view controller.

let mobileClient = AWSMobileClient.default()

3. Call the "initialize()" method on the AWSMobileClient object to initialize the SDK.

mobileClient.initialize { userState, error in

    if let userState = userState {

        // Handle successful initialization.

    } else if let error = error {

        // Handle initialization error.

    }

}

4. Use the "signIn" method on the AWSMobileClient object to authenticate a user.

mobileClient.signIn(username: "[email protected]", password: "password") { signInResult, error in

    if let signInResult = signInResult {

        // Handle successful sign-in.

    } else if let error = error {

        // Handle sign-in error.

    }

}

5. After a successful sign-in, you can use the "getIdentityId" method on the AWSMobileClient object to retrieve the user's identity ID.

mobileClient.getIdentityId { identityId, error in

    if let identityId = identityId {

        // Handle successful retrieval of identity ID.

    } else if let error = error {

        // Handle error retrieving identity ID.

    }

}

 

6. You can also use the AWSMobileClient object to perform other user authentication and authorization operations, such as sign-up, sign-out, and token refresh.

By following these steps, you can authenticate a user using Cognito in iOS and use the AWSMobileClient framework to perform other user authentication and authorization operations.

When you authenticate a user using Amazon Cognito in iOS, you receive an authentication token that you can use to grant access to AWS resources and perform other operations that require authorization. Here are some ways to handle authentication tokens in iOS:

  1. Store the authentication token in a secure location on the user's device, such as the keychain or encrypted user defaults. This ensures that the token is not accessible to other apps or users.
  2. Use the token to make authenticated requests to AWS services. You can include the token in the header of HTTP requests to AWS APIs, or use it to authenticate with AWS SDKs.
  3. Set an expiration time for the token and refresh it periodically. Amazon Cognito issues short-lived tokens to improve security. You can use the "refreshToken" method provided by the AWSMobileClient framework to obtain a new authentication token before the existing token expires.
  4. Invalidate the authentication token when the user signs out or revokes their authorization. You can use the "signOut" method provided by the AWSMobileClient framework to sign the user out and delete the authentication token.
  5. Use the authentication token to grant access to app features or resources that require authorization, such as in-app purchases or premium content. You can use the authentication token to verify that the user has the appropriate permissions to access these features.

By handling authentication tokens in these ways, you can provide a secure and reliable authentication experience for your iOS app users, and grant them access to the features and resources they need.

 

Section 3: Enhancing Security with Multi-Factor Authentication

security with multi factor authentication

1) Multi-factor authentication (MFA)

multi factor authentication

Multi-factor authentication (MFA) is a security feature that requires users to provide two or more forms of authentication in order to access a system or resource. MFA is designed to add an extra layer of security to the authentication process, making it more difficult for unauthorized users to gain access to sensitive data or systems.

In traditional authentication, users only need to provide a username and password to access a system or resource. 

With MFA, additional forms of authentication are required, such as a security token, a fingerprint scan, or a one-time code sent to a mobile device. This means that even if an attacker knows the user's password, they still cannot access the system or resource without the additional form(s) of authentication.

MFA can help protect against a variety of attacks, including phishing, password cracking, and social engineering. By requiring multiple forms of authentication, MFA makes it more difficult for attackers to compromise a user's account or steal sensitive data. Many online services and applications now offer MFA as an option for users who want to enhance the security of their accounts.

 

2) To enable multi-factor authentication in Cognito

multi factor authentication in cognito

Enabling multi-factor authentication (MFA) in Amazon Cognito involves configuring your user pool to require an additional form of authentication, such as an SMS text message, a time-based one-time password (TOTP), or a U2F security key. Here are the general steps to enable Multi Factor Authentication in Cognito:

  1. Navigate to your user pool in the Amazon Cognito console.
  2. In the left navigation menu, click on "MFA and verifications".
  3. Under "Multi-Factor Authentication (MFA)", select the checkbox next to "Require MFA".
  4. Select the checkboxes next to the MFA types you want to enable, such as SMS text message, TOTP, or U2F security key.
  5. Configure the MFA settings, such as the SMS message template, the TOTP time out, or the U2F security key settings.
  6. Click "Save changes" to save the MFA settings for your user pool.

Once you have enabled the Cognito MFA authenticator in your user pool, users will be required to provide an additional form of authentication when they sign in to your app or web service. They may be prompted to enter a code sent to their phone via SMS, use a TOTP app to generate a one-time code, or use a U2F security key to authenticate.

By enabling MFA in your user pool, you can help enhance the security of your app or web service and protect against unauthorized access to your users' accounts.

 

3) Implement multi-factor authentication in your iOS app

multi factor authentication in ios

Implementing multi-factor authentication (MFA) in your iOS app using Amazon Cognito involves configuring your user pool to require MFA and updating your app to prompt users for the additional form of authentication. Here are the general steps to implement MFA in your iOS app:

  1. Enable MFA in your user pool, as described in the previous answer.
  2. Update your iOS app to use the AWS Mobile SDK for iOS, which provides a pre-built user authentication and authorization solution that works with Cognito.
  3. Use the AWS Mobile SDK to implement the MFA flows in your app. For example, you can use the "MFA" method provided by the AWSMobileClient framework to prompt the user for an MFA code, or the "forgotPassword" method to initiate a forgotten password flow that requires MFA.
  4. Customize the MFA flows to match the user experience of your app. For example, you may want to provide a custom UI for entering the MFA code, or display a timer for TOTP codes.
  5. Test your app to ensure that MFA is working as expected, and that users can successfully authenticate with the additional form of authentication.

By implementing MFA in your iOS app, you can help enhance the security of your app and protect against unauthorized access to your users' accounts. MFA can be especially important for apps that handle sensitive data, such as financial or healthcare information.
 

Conclusion

In this conversation, we discussed AWS Authentication and Amazon Cognito, as well as how to integrate AWS Authentication using Cognito into iOS. We covered the steps involved in creating a new user pool, configuring the user pool settings, creating an app client, and setting up the AWS SDK for iOS. We also discussed how to authenticate a user using Cognito on iOS, how to handle authentication tokens, and how to enable multi-factor authentication in Cognito.

Integrating AWS Authentication using Cognito into your iOS app can provide a secure and scalable authentication solution, with the added benefit of MFA for enhanced security. By following the steps we discussed, you can help ensure that your users' data is protected and that your app meets the necessary security standards. If you need any more information about user authentication using AWS Cognito, get in touch with our mobile app development experts today!

Nayani Gaonkar
Nayani Gaonkar
Jr. Software Engineer
Acquia Certification: Tips & Resources by Joshua Fernandes

The Story of My First Acquia Certification

Joshua Fernandes
Coding Tips, Duke Experience

Coding Tips, Duke Experience

Sandeep Kumar
Case Study – Protein Smoothies (Mobile App)

Case Study – Protein Smoothies (Mobile App)

MOHAN PAI