Поделиться через


Включение проверки подлинности в собственном приложении Swift для iOS с помощью Azure AD B2C

Это важно

Начиная с 1 мая 2025 г. Azure AD B2C больше не будет доступен для приобретения для новых клиентов. Дополнительные сведения см. в разделе "Вопросы и ответы".

В этой статье показано, как добавить проверку подлинности Azure Active Directory B2C (Azure AD B2C) в собственное мобильное приложение iOS Swift. Узнайте, как интегрировать приложение iOS Swift с библиотекой проверки подлинности Майкрософт (MSAL) для iOS.

Используйте эту статью с настройкой проверки подлинности в примере приложения iOS Swift, заменив пример приложения iOS Swift собственным приложением iOS Swift. После выполнения инструкций, описанных в этой статье, приложение будет принимать входы через Azure AD B2C.

Предпосылки

Просмотрите предварительные требования и инструкции по интеграции в разделе "Настройка проверки подлинности" в примере приложения iOS Swift с помощью Azure AD B2C.

Создание проекта приложения Swift для iOS

Если у вас еще нет приложения iOS Swift, настройте новый проект, выполнив следующие действия.

  1. Откройте Xcode и выберите файл>нового>проекта.
  2. Для приложений iOS выберите приложение iOS> и нажмите кнопку "Далее".
  3. Для выбора параметров нового проекта укажите следующее:
    1. Имя продукта, например MSALiOS.
    2. Идентификатор организации, например contoso.com.
    3. Для интерфейса выберите Раскадровка.
    4. Для жизненного цикла выберите «Делегат приложения UIKit».
    5. Для языка выберите Swift.
  4. Нажмите кнопку Далее.
  5. Выберите папку, в которой нужно создать приложение, а затем нажмите кнопку "Создать".

Шаг 1. Установка библиотеки MSAL

  1. Используйте CocoaPods для установки библиотеки MSAL. В той же папке, что и xcodeproj-файл проекта, если файл podfile не существует, создайте пустой файл и назовите его podfile. Добавьте следующий код в файл podfile :

    use_frameworks!
    
    target '<your-target-here>' do
       pod 'MSAL'
    end
    
  2. Замените <your-target-here> именем проекта (например, MSALiOS). Дополнительные сведения см. в справочнике по синтаксису Podfile.

  3. В окне терминала перейдите в папку, содержащую файл podfile , а затем запустите pod, чтобы установить библиотеку MSAL.

  4. После выполнения pod install команды <создается файл проекта name.xcworkspace>. Чтобы перезагрузить проект в Xcode, закройте Xcode и откройте <файл проекта name.xcworkspace>.

Шаг 2. Настройка схемы URL-адреса приложения

При проверке подлинности пользователей Azure AD B2C отправляет код авторизации приложению с помощью URI перенаправления, настроенного для регистрации приложения Azure AD B2C.

Формат URI перенаправления по умолчанию для MSAL — это msauth.[Your_Bundle_Id]://auth. Примером будет msauth.com.microsoft.identitysample.MSALiOS://auth, где msauth.com.microsoft.identitysample.MSALiOS — это схема URL.

На этом шаге зарегистрируйте схему URL-адресов с помощью массива CFBundleURLSchemes . Приложение прослушивает схему URL-адресов для обратного вызова из Azure AD B2C.

В Xcode откройте файл Info.plist в качестве файла исходного кода. <dict> В разделе добавьте следующий фрагмент XML:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>msauth.com.microsoft.identitysample.MSALiOS</string>
        </array>
    </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>msauthv2</string>
    <string>msauthv3</string>
</array>

Шаг 3. Добавление кода проверки подлинности

Пример кода состоит из UIViewController класса. Класс:

  • Определяет структуру пользовательского интерфейса.
  • Содержит сведения о поставщике удостоверений Azure AD B2C. Приложение использует эти сведения для установления отношения доверия с Azure AD B2C.
  • Содержит аутентификационный код для аутентификации пользователей, получения токенов и их проверки.

Выберите элемент UIViewController, где пользователи проходят аутентификацию. Объедините ваш UIViewControllerкод с кодом, предоставленным на GitHub.

Шаг 4. Настройка приложения Swift для iOS

После добавления кода проверки подлинности настройте приложение Swift для iOS с параметрами Azure AD B2C. Параметры поставщика удостоверений Azure AD B2C настраиваются в UIViewController классе, выбранном в предыдущем разделе.

Сведения о настройке приложения iOS Swift см. в статье "Настройка проверки подлинности в примере приложения iOS Swift с помощью Azure AD B2C".

Шаг 5. Запуск и тестирование мобильного приложения

  1. Создайте и запустите проект с симулятором подключенного устройства iOS.
  2. Выберите "Войти", а затем зарегистрируйтесь или войдите с помощью локальной или социальной учетной записи Azure AD B2C.
  3. После успешной проверки подлинности вы увидите отображаемое имя на панели навигации.

Шаг 6. Настройка стандартных блоков кода

В этом разделе описаны стандартные блоки кода, которые обеспечивают проверку подлинности для приложения Swift для iOS. В нем перечислены методы UIViewController и обсуждаются способы настройки кода.

Шаг 6.1. Создание экземпляра общедоступного клиентского приложения

Общедоступные клиентские приложения не являются доверенными для безопасного хранения секретов приложений, и у них нет секретов клиента. В viewDidLoad создайте экземпляр MSAL с помощью общедоступного объекта клиентского приложения.

В следующем фрагменте кода Swift показано, как инициализировать MSAL с MSALPublicClientApplicationConfig помощью объекта конфигурации.

Объект конфигурации предоставляет сведения о среде Azure AD B2C. Например, он предоставляет идентификатор клиента, адрес перенаправления и авторитет для создания запросов проверки подлинности в Azure AD B2C. Сведения об объекте конфигурации см. в разделе "Настройка примера мобильного приложения".

do {

    let signinPolicyAuthority = try self.getAuthority(forPolicy: self.kSignupOrSigninPolicy)
    let editProfileAuthority = try self.getAuthority(forPolicy: self.kEditProfilePolicy)
    
    let pcaConfig = MSALPublicClientApplicationConfig(clientId: kClientID, redirectUri: kRedirectUri, authority: signinPolicyAuthority)
    pcaConfig.knownAuthorities = [signinPolicyAuthority, editProfileAuthority]
    
    self.applicationContext = try MSALPublicClientApplication(configuration: pcaConfig)
    self.initWebViewParams()
    
    } catch {
        self.updateLoggingText(text: "Unable to create application \(error)")
    }

Метод initWebViewParams настраивает интерактивный интерфейс проверки подлинности .

Следующий фрагмент кода Swift инициализирует webViewParameters член класса с помощью системного веб-интерфейса. Дополнительные сведения см. в разделе "Настройка браузеров и WebViews для iOS/macOS".

func initWebViewParams() {
    self.webViewParameters = MSALWebviewParameters(authPresentationViewController: self)
    self.webViewParameters?.webviewType = .default
}

Шаг 6.2. Запуск интерактивного запроса авторизации

Интерактивный запрос авторизации — это поток, в котором пользователям предлагается зарегистрироваться или войти в систему с помощью системного веб-представления. Когда пользователи выбирают кнопку входа , authorizationButton вызывается метод.

Метод authorizationButton подготавливает MSALInteractiveTokenParameters объект с соответствующими данными о запросе авторизации. Метод acquireToken использует MSALInteractiveTokenParameters для аутентификации пользователей через системный веб-интерфейс.

В следующем фрагменте кода показано, как запустить интерактивный запрос авторизации:

let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParameters!)
parameters.promptType = .selectAccount
parameters.authority = authority

applicationContext.acquireToken(with: parameters) { (result, error) in

// On error code    
guard let result = result else {
    self.updateLoggingText(text: "Could not acquire token: \(error ?? "No error information" as! Error)")
    return
}

// On success code
self.accessToken = result.accessToken
self.updateLoggingText(text: "Access token is \(self.accessToken ?? "Empty")")
}

Когда пользователи завершают поток авторизации, либо успешно, либо неудачно, результат возвращается к закрытиюacquireToken метода.

Метод acquireToken возвращает result и error объекты. Используйте это замыкание, чтобы:

  • Обновите пользовательский интерфейс мобильного приложения с информацией после завершения проверки подлинности.
  • Вызовите службу веб-API с токеном доступа.
  • Обработка ошибок проверки подлинности (например, когда пользователь отменяет поток входа).

Шаг 6.3. Вызов веб-API

Чтобы вызвать веб-API авторизации на основе маркеров, приложение должно иметь действительный маркер доступа. Приложение выполняет следующие действия.

  1. Получает токен доступа с необходимыми разрешениями (областями) для конечной точки веб-API.
  2. Передает токен доступа в качестве bearer-токена в заголовке HTTP-запроса на авторизацию с использованием этого формата:
Authorization: Bearer <access-token>

При интерактивной проверке подлинности приложение получает маркер доступа в замыкании acquireToken. Для последующих вызовов веб-API используйте метод тихого получения токена (acquireTokenSilent), как описано в этом разделе.

Метод acquireTokenSilent выполняет следующие действия:

  1. Он пытается получить токен доступа с запрошенными областями действия из кэша токенов. Если токен присутствует и не истек, возвращается токен.
  2. Если маркер отсутствует в кэше маркеров или истек срок действия, библиотека MSAL пытается использовать маркер обновления для получения нового маркера доступа.
  3. Если маркер обновления не существует или истек, возвращается исключение. В этом случае пользователю следует войти в систему интерактивно.

В следующем фрагменте кода показано, как получить маркер доступа:

do {

// Get the authority using the sign-in or sign-up user flow
let authority = try self.getAuthority(forPolicy: self.kSignupOrSigninPolicy)

// Get the current account from the application context
guard let thisAccount = try self.getAccountByPolicy(withAccounts: applicationContext.allAccounts(), policy: kSignupOrSigninPolicy) else {
    self.updateLoggingText(text: "There is no account available!")
    return
}

// Configure the acquire token silent parameters
let parameters = MSALSilentTokenParameters(scopes: kScopes, account:thisAccount)
parameters.authority = authority
parameters.loginHint = "username"

// Acquire token silent
self.applicationContext.acquireTokenSilent(with: parameters) { (result, error) in
    if let error = error {
        
        let nsError = error as NSError
        
        // interactionRequired means we need to ask the user to sign in. This usually happens
        // when the user's Refresh Token is expired or if the user has changed their password
        // among other possible reasons.
        
        if (nsError.domain == MSALErrorDomain) {
            
            if (nsError.code == MSALError.interactionRequired.rawValue) {
                
                // Start an interactive authorization code
                // Notice we supply the account here. This ensures we acquire token for the same account
                // as we originally authenticated.
                
                ...
            }
        }
        
        self.updateLoggingText(text: "Could not acquire token: \(error)")
        return
    }
    
    guard let result = result else {
        
        self.updateLoggingText(text: "Could not acquire token: No result returned")
        return
    }
    
    // On success, set the access token to the accessToken class member. 
    // The callGraphAPI method uses the access token to call a web API  
    self.accessToken = result.accessToken
    ...
}
} catch {
self.updateLoggingText(text: "Unable to construct parameters before calling acquire token \(error)")
}

Метод callGraphAPI получает маркер доступа и вызывает веб-API, как показано ниже:

@objc func callGraphAPI(_ sender: UIButton) {
    guard let accessToken = self.accessToken else {
        self.updateLoggingText(text: "Operation failed because could not find an access token!")
        return
    }
    
    let sessionConfig = URLSessionConfiguration.default
    sessionConfig.timeoutIntervalForRequest = 30
    let url = URL(string: self.kGraphURI)
    var request = URLRequest(url: url!)
    request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
    let urlSession = URLSession(configuration: sessionConfig, delegate: self, delegateQueue: OperationQueue.main)
    
    self.updateLoggingText(text: "Calling the API....")
    
    urlSession.dataTask(with: request) { data, response, error in
        guard let validData = data else {
            self.updateLoggingText(text: "Could not call API: \(error ?? "No error information" as! Error)")
            return
        }
        
        let result = try? JSONSerialization.jsonObject(with: validData, options: [])
        
        guard let validResult = result as? [String: Any] else {
            self.updateLoggingText(text: "Nothing returned from API")
            return
        }
        
        self.updateLoggingText(text: "API response: \(validResult.debugDescription)")
        }.resume()
}

Шаг 6.4. Выход пользователей

Выход с помощью MSAL удаляет все известные сведения о пользователях из приложения. Используйте метод выхода для выхода пользователей и обновления пользовательского интерфейса. Например, можно скрыть защищенные элементы пользовательского интерфейса, скрыть кнопку выхода или показать кнопку входа.

В следующем фрагменте кода показано, как выйти из системы пользователей.

@objc func signoutButton(_ sender: UIButton) {
do {
    
    
    let thisAccount = try self.getAccountByPolicy(withAccounts: applicationContext.allAccounts(), policy: kSignupOrSigninPolicy)
    
    if let accountToRemove = thisAccount {
        try applicationContext.remove(accountToRemove)
    } else {
        self.updateLoggingText(text: "There is no account to signing out!")
    }
    
    ...
    
} catch  {
    self.updateLoggingText(text: "Received error signing out: \(error)")
}
}

Дальнейшие шаги

Узнайте, как: