如何使用 VideoSubscriberAccount 框架通过 Apple SSO(电视提供商)进行身份验证

How to authenticate with Apple SSO (TV Provider) using VideoSubscriberAccount framework

我需要使用 Apple SSO 为我的应用程序实施身份验证方案:

  1. 在“设置电视提供商”中检查已注册用户
  2. 如果没有注册用户,请从我的应用程序中登录 TV Provider
  3. 使用令牌、uuid 等从我的提供商后端获取已签名用户的身份验证负载

使用 VideoSubscriberAccount 框架配置和实施 Apple SSO 身份验证的主要步骤是什么,因为遗憾的是没有太多信息和示例?

使用 Apple SSO 实施身份验证方案有几个常见步骤:

1.配置您的临时配置文件、.entitlements 和 Info.plist 文件

YourApp.entitlements 文件必须具有为您的应用启用 SSO 的特殊密钥:

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

此权利也应出现在您的临时个人资料中,例如:

Info.plist 必须有下一个密钥,其中包含将在用户首次访问视频订阅时显示给用户的消息:

NSVideoSubscriberAccountUsageDescription String "This app needs access to your TV Provider."

2。创建帐户管理器实例并实施委托方法以协调对订阅者帐户的访问。

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。请求有关订阅者帐户的信息。

如果获得访问权限,您可以发出元数据请求以检查是否有签名用户:

if case .granted = status {         
    let request = VSAccountMetadataRequest()
    request.includeAccountProviderIdentifier = true
    request.isInterruptionAllowed = true
    accountManager.enqueue(request) { metadata, error in
        ...
    }
}

如果没有已签名的帐户,将显示供应商选择列表和 sign-in 表格:

要跳过提供商列表视图,您可以为请求设置支持的提供商标识符,例如:

request.supportedAccountProviderIdentifiers = ["Hulu"]

5.具有来自身份提供者的信息端点的必需属性的第二个元数据请求

如果没有错误并且存在签名帐户,您应该调用身份提供者的信息端点以获取第二次元数据调用所需的属性,例如:

  • attributeNames: 需要的 SAML 属性列表
  • verificationToken: 从服务提供商到身份提供商的 Base64 编码签名身份验证请求
  • channelIdentifier: 服务提供商实体id

并使用这些参数发出第二个请求:

request.attributeNames = attributeNames
request.verificationToken = verificationToken
request.channelIdentifier = channelIdentifier
                        
accountManager.enqueue(request) { metadata, error in
    ...
}

6.请求翻译 SAML 身份验证响应

秒元数据请求以 Apple 的 SAML 负载响应,该负载应发送到您的身份提供商的翻译端点,然后端点解析该元素和 returns 类似于身份验证负载的响应,例如:

if let samlPayload = metadata?.samlAttributeQueryResponse {
    let body = [
        ...
        "saml" : samlPayload
    ]
    fetch("https://your.identity.provider/saml/translate", httpBody: body)
}

端点应以 JSON 响应,其中包含您的所有身份验证数据:令牌、uuid 等。