Существует несколько общих шагов для реализации схемы аутентификации с Apple SSO:
1. Настройте предварительный профиль, файлы .entitlements и Info.plist.
Файл YourApp.entitlements должен иметь специальный ключ, который включает единый вход для вашего приложения:
com.apple.developer.video-subscriber-single-sign-on Boolean YES
Это право также должно присутствовать в вашем предварительном профиле, например:
Info.plist must have next key with a message that will be shown to user on first access to the video subscriptions:
NSVideoSubscriberAccountUsageDescription String "This app needs access to your TV Provider."
2. Create an account manager instance and implement delegate methods to coordinate access to a subscriber's account.
import VideoSubscriberAccount
...
let accountManager = VSAccountManager()
accountManager.delegate = self
...
extension YourController : VSAccountManagerDelegate {
func accountManager(_ accountManager: VSAccountManager, present viewController: UIViewController) {
window?.rootViewController?.present(viewController, animated: true, completion: nil)
}
func accountManager(_ accountManager: VSAccountManager, dismiss viewController: UIViewController) {
viewController.dismiss(animated: true, completion: nil)
}
func accountManager(_ accountManager: VSAccountManager, shouldAuthenticateAccountProviderWithIdentifier accountProviderIdentifier: String) -> Bool {
return true
}
}
3. Определите состояние доступа приложения к информации о подписке пользователя.
accountManager.checkAccessStatus(options: [VSCheckAccessOption.prompt : true]) { status, error in
...
}
Если приложение пытается получить доступ к информации о подписке в первый раз, будет показано следующее приглашение:
4. Request information about the subscriber's account.
If access is granted you can make a metadata request to check for a signed user:
if case .granted = status {
let request = VSAccountMetadataRequest()
request.includeAccountProviderIdentifier = true
request.isInterruptionAllowed = true
accountManager.enqueue(request) { metadata, error in
...
}
}
Список выбора провайдера и форма входа будут показаны, если нет подписанной учетной записи:
To skip providers list view you can set supported providers identifiers to the request e.g.:
request.supportedAccountProviderIdentifiers = ["Hulu"]
5. Второй запрос метаданных с обязательными атрибутами от конечной точки информации поставщика удостоверений
Если нет ошибки и имеется подписанная учетная запись, вам следует позвонить в конечную точку информации поставщика удостоверений, чтобы получить необходимые атрибуты для второго вызова метаданных, например :
attributeNames
: список необходимых атрибутов SAML verificationToken
: подписанный запрос аутентификации в кодировке Base64 от поставщика услуг поставщику удостоверений channelIdentifier
: идентификатор объекта поставщика услуг
И сделайте второй запрос с такими параметрами:
request.attributeNames = attributeNames
request.verificationToken = verificationToken
request.channelIdentifier = channelIdentifier
accountManager.enqueue(request) { metadata, error in
...
}
6. Запрос на перевод ответа аутентификации SAML
На запрос метаданных секунд отвечает полезная нагрузка SAML от Apple, которая должна быть отправлена в конечную точку перевода вашего поставщика удостоверений, после чего конечная точка анализирует этот элемент и возвращает ответ, напоминающий полезную нагрузку аутентификации, например :
if let samlPayload = metadata?.samlAttributeQueryResponse {
let body = [
...
"saml" : samlPayload
]
fetch("https://your.identity.provider/saml/translate", httpBody: body)
}
Конечная точка должна ответить JSON, который содержит все ваши данные аутентификации: токены, uuid и т. Д. c.