Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Начиная с 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, настройте новый проект, выполнив следующие действия.
- Откройте Xcode и выберите файл>нового>проекта.
- Для приложений iOS выберите приложение iOS> и нажмите кнопку "Далее".
- Для выбора параметров нового проекта укажите следующее:
-
Имя продукта, например
MSALiOS. -
Идентификатор организации, например
contoso.com. - Для интерфейса выберите Раскадровка.
- Для жизненного цикла выберите «Делегат приложения UIKit».
- Для языка выберите Swift.
-
Имя продукта, например
- Нажмите кнопку Далее.
- Выберите папку, в которой нужно создать приложение, а затем нажмите кнопку "Создать".
Шаг 1. Установка библиотеки MSAL
Используйте CocoaPods для установки библиотеки MSAL. В той же папке, что и xcodeproj-файл проекта, если файл podfile не существует, создайте пустой файл и назовите его podfile. Добавьте следующий код в файл podfile :
use_frameworks! target '<your-target-here>' do pod 'MSAL' endЗамените
<your-target-here>именем проекта (например,MSALiOS). Дополнительные сведения см. в справочнике по синтаксису Podfile.В окне терминала перейдите в папку, содержащую файл podfile , а затем запустите pod, чтобы установить библиотеку MSAL.
После выполнения
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 классе, выбранном в предыдущем разделе.
Шаг 5. Запуск и тестирование мобильного приложения
- Создайте и запустите проект с симулятором подключенного устройства iOS.
- Выберите "Войти", а затем зарегистрируйтесь или войдите с помощью локальной или социальной учетной записи Azure AD B2C.
- После успешной проверки подлинности вы увидите отображаемое имя на панели навигации.
Шаг 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 авторизации на основе маркеров, приложение должно иметь действительный маркер доступа. Приложение выполняет следующие действия.
- Получает токен доступа с необходимыми разрешениями (областями) для конечной точки веб-API.
- Передает токен доступа в качестве bearer-токена в заголовке HTTP-запроса на авторизацию с использованием этого формата:
Authorization: Bearer <access-token>
При интерактивной проверке подлинности приложение получает маркер доступа в замыкании acquireToken. Для последующих вызовов веб-API используйте метод тихого получения токена (acquireTokenSilent), как описано в этом разделе.
Метод acquireTokenSilent выполняет следующие действия:
- Он пытается получить токен доступа с запрошенными областями действия из кэша токенов. Если токен присутствует и не истек, возвращается токен.
- Если маркер отсутствует в кэше маркеров или истек срок действия, библиотека MSAL пытается использовать маркер обновления для получения нового маркера доступа.
- Если маркер обновления не существует или истек, возвращается исключение. В этом случае пользователю следует войти в систему интерактивно.
В следующем фрагменте кода показано, как получить маркер доступа:
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)")
}
}
Дальнейшие шаги
Узнайте, как: