Как пройти аутентификацию с помощью Apple SSO (TV Provider) с помощью платформы VideoSubscriberAccount - PullRequest
0 голосов
/ 04 августа 2020

Мне нужно реализовать схему аутентификации с использованием Apple SSO для моего приложения:

  1. Проверить наличие подписанного пользователя в настройках TV Provider
  2. Войдите в TV Provider из моего приложения, если есть не является подписанным пользователем
  3. Получить полезную нагрузку аутентификации подписанного пользователя из серверной части моего провайдера с помощью токенов, uuid и т. д. c.

Какие основные шаги по настройке и внедрению Apple Аутентификация SSO с использованием VideoSubscriberAccount framework, потому что, к сожалению, нет много информации и примеров о?

1 Ответ

1 голос
/ 04 августа 2020

Существует несколько общих шагов для реализации схемы аутентификации с Apple SSO:

1. Настройте предварительный профиль, файлы .entitlements и Info.plist.

Файл YourApp.entitlements должен иметь специальный ключ, который включает единый вход для вашего приложения:

com.apple.developer.video-subscriber-single-sign-on Boolean YES

Это право также должно присутствовать в вашем предварительном профиле, например:

enter image description here

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
...
}

Если приложение пытается получить доступ к информации о подписке в первый раз, будет показано следующее приглашение:

enter image description here

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
        ...
    }
}

Список выбора провайдера и форма входа будут показаны, если нет подписанной учетной записи:

enter image description here

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...