Guía de Apple SSO (API de REST V1) apple-sso-cookbook-rest-api-v1
La API de REST de autenticación de Adobe Pass V1 es compatible con el inicio de sesión único (SSO) de socio para usuarios finales de aplicaciones cliente que se ejecutan en iOS, iPadOS o tvOS.
Este documento actúa como una extensión de la documentación de la API V1 de REST existente, que se puede encontrar aquí.
Guía apple-sso-cookbook-rest-api-v1-cookbook
Para beneficiarse de la experiencia del usuario de SSO de Apple, la aplicación necesita integrar el Marco de cuenta del suscriptor de vídeo desarrollado por Apple, mientras que para la comunicación de la API de REST de autenticación de Adobe Pass V1, debe seguir la secuencia de pasos que se presentan a continuación.
Permiso apple-sso-cookbook-rest-api-v1-permission
Settings -> TV Provider
en iOS y iPadOS o a Settings -> Accounts -> TV Provider
en tvOS.Autenticación apple-sso-cookbook-rest-api-v1-authentication
- ¿Hay un token de autenticación de Adobe válido?
- ¿El usuario ha iniciado sesión mediante SSO de socio?
- Recuperar configuración de Adobe
- Iniciar flujo de trabajo de SSO de socio con configuración de Adobe
- ¿El usuario ha iniciado sesión correctamente?
- Obtener una solicitud de perfil del Adobe para la MVPD seleccionada
- Reenviar la solicitud de Adobe al SSO del socio para obtener el perfil
- Intercambio del perfil SSO del socio por un token de autenticación de Adobe
- ¿Se ha generado correctamente el token de Adobe?
- Iniciar flujo de trabajo de autenticación regular
- Continuar con flujos de autorización
Paso: "¿Hay un token de autenticación de Adobe válido?" step1
Paso: "¿El usuario ha iniciado sesión mediante SSO de socio?" step2
- La aplicación tendría que comprobar si tiene permiso para acceder a la información de suscripción del usuario y continuar solo si el usuario lo permite.
- La aplicación tendría que enviar una solicitud para obtener información de la cuenta del suscriptor.
- La aplicación tendría que esperar y procesar la información de metadata.
...
let videoSubscriberAccountManager: VSAccountManager = VSAccountManager();
videoSubscriberAccountManager.checkAccessStatus(options: [VSCheckAccessOption.prompt: true]) { (accessStatus, error) -> Void in
switch (accessStatus) {
// The user allows the application to access subscription information.
case VSAccountAccessStatus.granted:
// Construct the request for subscriber account information.
let vsaMetadataRequest: VSAccountMetadataRequest = VSAccountMetadataRequest();
// This is actually the SAML Issuer not the channel ID.
vsaMetadataRequest.channelIdentifier = "https://saml.sp.auth.adobe.com";
// This is the subscription account information needed at this step.
vsaMetadataRequest.includeAccountProviderIdentifier = true;
// This is the subscription account information needed at this step.
vsaMetadataRequest.includeAuthenticationExpirationDate = true;
// This is going to make the Video Subscriber Account Framework to refrain from prompting the user with the providers picker at this step.
vsaMetadataRequest.isInterruptionAllowed = false;
// Submit the request for subscriber account information - accountProviderIdentifier.
videoSubscriberAccountManager.enqueue(vsaMetadataRequest) { vsaMetadata, vsaError in
if (vsaMetadata != nil && vsaMetadata!.accountProviderIdentifier != nil) {
// The vsaMetadata!.authenticationExpirationDate will contain the expiration date for current authentication session.
// The vsaMetadata!.authenticationExpirationDate should be compared against current date.
...
// The vsaMetadata!.accountProviderIdentifier will contain the provider identifier as it is known for the platform configuration.
// The vsaMetadata!.accountProviderIdentifier represents the platformMappingId in terms of Adobe Pass Authentication configuration.
...
// The application must determine the MVPD id property value based on the platformMappingId property value obtained above.
// The application must use the MVPD id further in its communication with Adobe Pass Authentication services.
...
// Continue with the "Obtain a profile request from Adobe for the selected MVPD" step.
...
// Continue with the "Forward the Adobe request to Partner SSO to obtain the profile" step.
...
} else {
// The user is not authenticated at platform level, continue with the "Fetch Adobe configuration" step.
...
}
}
// The user has not yet made a choice or does not allow the application to access subscription information.
default:
// Continue with the "Initiate regular authentication workflow" step.
...
}
}
...
Paso: "Recuperar configuración de Adobe" step3
enablePlatformServices
, boardingStatus
, displayInPlatformPicker
, platformMappingId
, requiredMetadataFields
y preste especial atención a los comentarios presentados en fragmentos de código de otros pasos.Paso "Iniciar flujo de trabajo de SSO de socio con configuración de Adobe" step4
- La aplicación tendría que comprobar si tiene permiso para acceder a la información de suscripción del usuario y continuar solo si el usuario lo permite.
- La aplicación tendría que proporcionar un delegado para VSAccountManager.
- La aplicación tendría que enviar una solicitud para obtener información de la cuenta del suscriptor.
- La aplicación tendría que esperar y procesar la información de metadata.
...
let videoSubscriberAccountManager: VSAccountManager = VSAccountManager();
// This must be a class implementing the VSAccountManagerDelegate protocol.
let videoSubscriberAccountManagerDelegate: VideoSubscriberAccountManagerDelegate = VideoSubscriberAccountManagerDelegate();
videoSubscriberAccountManager.delegate = videoSubscriberAccountManagerDelegate;
videoSubscriberAccountManager.checkAccessStatus(options: [VSCheckAccessOption.prompt: true]) { (accessStatus, error) -> Void in
switch (accessStatus) {
// The user allows the application to access subscription information.
case VSAccountAccessStatus.granted:
// Construct the request for subscriber account information.
let vsaMetadataRequest: VSAccountMetadataRequest = VSAccountMetadataRequest();
// This is actually the SAML Issuer not the channel ID.
vsaMetadataRequest.channelIdentifier = "https://saml.sp.auth.adobe.com";
// This is the subscription account information needed at this step.
vsaMetadataRequest.includeAccountProviderIdentifier = true;
// This is the subscription account information needed at this step.
vsaMetadataRequest.includeAuthenticationExpirationDate = true;
// This is going to make the Video Subscriber Account Framework to prompt the user with the providers picker at this step.
vsaMetadataRequest.isInterruptionAllowed = true;
// This can be computed from the [Adobe Pass Authentication](https://experienceleague.adobe.com/docs/pass/authentication/programmer-integration-guide/rest-api-v1/rest-api-reference/provide-mvpd-list.html?lang=es) service response in order to filter the TV providers from the Apple picker.
vsaMetadataRequest.supportedAccountProviderIdentifiers = supportedAccountProviderIdentifiers;
// This can be computed from the [Adobe Pass Authentication](https://experienceleague.adobe.com/docs/pass/authentication/programmer-integration-guide/rest-api-v1/rest-api-reference/provide-mvpd-list.html?lang=es) service response in order to sort the TV providers from the Apple picker.
if #available(iOS 11.0, tvOS 11, *) {
vsaMetadataRequest.featuredAccountProviderIdentifiers = featuredAccountProviderIdentifiers;
}
// Submit the request for subscriber account information - accountProviderIdentifier.
videoSubscriberAccountManager.enqueue(vsaMetadataRequest) { vsaMetadata, vsaError in
// This represents the checks for the "Is user login successful?" step.
if (vsaMetadata != nil && vsaMetadata!.accountProviderIdentifier != nil) {
// The vsaMetadata!.authenticationExpirationDate will contain the expiration date for current authentication session.
// The vsaMetadata!.authenticationExpirationDate should be compared against current date.
...
// The vsaMetadata!.accountProviderIdentifier will contain the provider identifier as it is known for the platform configuration.
// The vsaMetadata!.accountProviderIdentifier represents the platformMappingId in terms of Adobe Pass Authentication configuration.
...
// The application must determine the MVPD id property value based on the platformMappingId property value obtained above.
// The application must use the MVPD id further in its communication with Adobe Pass Authentication services.
...
// Continue with the "Obtain a profile request from Adobe for the selected MVPD" step.
...
// Continue with the "Forward the Adobe request to Partner SSO to obtain the profile" step.
...
} else {
// The user is not authenticated at platform level.
if (vsaError != nil) {
// The application can check to see if the user selected a provider which is present in Apple picker, but the provider is not onboarded in platform SSO.
if let error: NSError = (vsaError! as NSError), error.code == 1, let appleMsoId = error.userInfo["VSErrorInfoKeyUnsupportedProviderIdentifier"] as! String? {
var mvpd: Mvpd? = nil;
// The requestor.mvpds must be computed during the "Fetch Adobe configuration" step.
for provider in requestor.mvpds {
if provider.platformMappingId == appleMsoId {
mvpd = provider;
break;
}
}
if mvpd != nil {
// Continue with the "Initiate regular authentication workflow" step, but you can skip prompting the user with your MVPD picker and use the mvpd selection, therefore creating a better UX.
...
} else {
// Continue with the "Initiate regular authentication workflow" step.
...
}
} else {
// Continue with the "Initiate regular authentication workflow" step.
...
}
} else {
// Continue with the "Initiate regular authentication workflow" step.
...
}
}
}
// The user has not yet made a choice or does not allow the application to access subscription information.
default:
// Continue with the "Initiate regular authentication workflow" step.
...
}
}
...
Paso: "¿El inicio de sesión del usuario se ha realizado correctamente?" step5
vsaMetadata!.accountProviderIdentifier
contenga un valor válido y la fecha actual no haya pasado el valor vsaMetadata!.authenticationExpirationDate
.Paso "Obtener una solicitud de perfil del Adobe para la MVPD seleccionada" step6
platformMappingId
en términos de la configuración de autenticación de Adobe Pass. Por lo tanto, la aplicación debe determinar el valor de la propiedad MVPD id, usando el valor platformMappingId
, a través del medio del servicio de API Adobe Pass Authentication Provider MVPD List.Paso: "Reenviar la solicitud de Adobe al SSO del socio para obtener el perfil" step7
- La aplicación tendría que comprobar si tiene permiso para acceder a la información de suscripción del usuario y continuar solo si el usuario lo permite.
- La aplicación tendría que enviar una solicitud para obtener información de la cuenta del suscriptor.
- La aplicación tendría que esperar y procesar la información de metadata.
...
let videoSubscriberAccountManager: VSAccountManager = VSAccountManager();
videoSubscriberAccountManager.checkAccessStatus(options: [VSCheckAccessOption.prompt: true]) { (accessStatus, error) -> Void in
switch (accessStatus) {
// The user allows the application to access subscription information.
case VSAccountAccessStatus.granted:
// Construct the request for subscriber account information.
let vsaMetadataRequest: VSAccountMetadataRequest = VSAccountMetadataRequest();
// This is actually the SAML Issuer not the channel ID.
vsaMetadataRequest.channelIdentifier = "https://saml.sp.auth.adobe.com";
// This is going to include subscription account information which should match the provider determined in a previous step.
vsaMetadataRequest.includeAccountProviderIdentifier = true;
// This is going to include subscription account information which should match the provider determined in a previous step.
vsaMetadataRequest.includeAuthenticationExpirationDate = true;
// This is going to make the Video Subscriber Account Framework to refrain from prompting the user with the providers picker at this step.
vsaMetadataRequest.isInterruptionAllowed = false;
// This are the user metadata fields expected to be available on a successful login and are determined from the [Adobe Pass Authentication](https://experienceleague.adobe.com/docs/pass/authentication/programmer-integration-guide/rest-api-v1/rest-api-reference/provide-mvpd-list.html?lang=es) service. Look for the requiredMetadataFields associated with the provider determined in a previous step.
vsaMetadataRequest.attributeNames = requiredMetadataFields;
// This is the payload from [Adobe Pass Authentication](https://experienceleague.adobe.com/docs/pass/authentication/programmer-integration-guide/rest-api-v1/rest-api-reference/retrieve-profilerequest.html?lang=es) service.
vsaMetadataRequest.verificationToken = profileRequestPayload;
// Submit the request for subscriber account information.
videoSubscriberAccountManager.enqueue(vsaMetadataRequest) { vsaMetadata, vsaError in
if (vsaMetadata != nil && vsaMetadata!.samlAttributeQueryResponse != nil) {
var samlResponse: String? = vsaMetadata!.samlAttributeQueryResponse!;
// Remove new lines, new tabs and spaces.
samlResponse = samlResponse?.replacingOccurrences(of: "[ \\t]+", with: " ", options: String.CompareOptions.regularExpression);
samlResponse = samlResponse?.components(separatedBy: CharacterSet.newlines).joined(separator: "");
samlResponse = samlResponse?.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines);
// Base64 encode.
samlResponse = samlResponse?.data(using: .utf8)?.base64EncodedString(options: []);
// URL encode. Please be aware not to double URL encode it further.
samlResponse = samlResponse?.addingPercentEncoding(withAllowedCharacters: CharacterSet.init(charactersIn: "!*'();:@&=+$,/?%#[]").inverted);
// Continue with the "Exchange the Partner SSO profile for an Adobe authentication token" step.
...
} else {
// Continue with the "Initiate regular authentication workflow" step.
...
}
}
// The user has not yet made a choice or does not allow the application to access subscription information.
default:
// Continue with the "Initiate regular authentication workflow" step.
...
}
}
...
Paso: "Intercambio del perfil SSO del socio por un token de autenticación de Adobe" step8
vsaMetadata!.samlAttributeQueryResponse!
representa el(la) SAMLResponse
, que debe pasarse en Intercambio de tokens y requiere manipulación de cadenas y codificación (Codificado(a) Base64 y codificado(a) URL posteriormente) antes de realizar la llamada.Paso: "¿El token de Adobe se ha generado correctamente?" step9
204 No Content
, lo que indica que el token se creó correctamente y está listo para utilizarse en los flujos de autorización.Paso: "Iniciar flujo de trabajo de autenticación regular" step10
- La aplicación tendría que obtener un código de registro y presentarlo al usuario final en el primer dispositivo (pantalla).
- La aplicación tendría que iniciar sondeo para confirmar el estado de autenticación en el primer dispositivo (pantalla) después de obtener el código de registro.
- Otra aplicación tendría que iniciar autenticación en un segundo dispositivo (pantalla) cuando se use el código de registro.
- La aplicación tendría que detener el sondeo en el primer dispositivo (pantalla) cuando se genere el token de autenticación.
- La aplicación tendría que obtener un código de registro que no debería presentarse al usuario final en el primer dispositivo (pantalla).
- La aplicación tendría que iniciar la autenticación en el primer dispositivo (pantalla) usando el código de registro y un componente WKWebView o SFSafariViewController.
- La aplicación tendría que iniciar sondeo para conocer el estado de autenticación en el primer dispositivo (pantalla) después de que se cierre WKWebView o el componente SFSafariViewController.
- La aplicación tendría que detener el sondeo en el primer dispositivo (pantalla) cuando se genere el token de autenticación.
Paso: "Continuar con los flujos de autorización" step11
Cerrar sesión apple-sso-cookbook-rest-api-v1-logout
El marco de cuenta de suscriptor de vídeo no proporciona una API para cerrar la sesión mediante programación de las personas que han iniciado sesión en su cuenta de proveedor de TV en el nivel de sistema del dispositivo. Por lo tanto, para que el cierre de sesión surta efecto, el usuario final tendría que cerrar sesión explícitamente desde Settings -> TV Provider
en iOS/iPadOS o Settings -> Accounts -> TV Provider
en tvOS. La otra opción que tendría el usuario es retirar el permiso para acceder a la información de suscripción del usuario desde la sección de configuración específica de la aplicación (acceso al proveedor de TV).
- La aplicación tendría que determinar si la autenticación se ha producido como resultado de un inicio de sesión a través del SSO del socio o no, utilizando los "tokenSource" metadatos de usuario del servicio de autenticación de Adobe Pass.
- La aplicación tendría que indicar o pedir al usuario que cierre sesión explícitamente desde
Settings -> Accounts -> TV Provider
en tvOS solo en caso de que el valor "tokenSource" sea igual a "Apple". - La aplicación tendría que iniciar el cierre de sesión desde el servicio de autenticación de Adobe Pass usando una llamada HTTP directa. Esto no facilitaría la limpieza de la sesión en el lado de MVPD.
- La aplicación tendría que determinar si la autenticación se ha producido como resultado de un inicio de sesión a través del SSO del socio o no, utilizando los "tokenSource" metadatos de usuario del servicio de autenticación de Adobe Pass.
- La aplicación tendría que indicar o pedir al usuario que cierre sesión explícitamente desde
Settings -> TV Provider
en iOS/iPadOS solo en caso de que el valor "tokenSource" sea igual a "Apple". - La aplicación tendría que iniciar el cierre de sesión desde el servicio de autenticación de Adobe Pass usando un WKWebView o un componente SFSafariViewController. Esto facilitaría la limpieza de la sesión en el lado de MVPD.