(旧版)Amazon FireOS集成指南 amazon-fireos-integration-cookbook
简介 intro
本文档描述了程序员的上层应用程序可以通过Amazon FireOS AccessEnabler库公开的API实施的授权工作流。
适用于Amazon FireOS的Adobe Pass身份验证权利解决方案最终分为两个域:
-
UI域 — 这是上层应用程序层,它实现UI并使用
AccessEnabler库提供的服务来提供对受限内容的访问权限。 -
AccessEnabler域 — 这是权利工作流的实施形式:- 对Adobe后端服务器发出的网络调用
- 与身份验证和授权工作流相关的业务逻辑规则
- 管理各种资源和处理工作流状态(如令牌缓存)
AccessEnabler域的目标是隐藏授权工作流的所有复杂内容,并(通过AccessEnabler库)向上层应用程序提供一组简单的授权基元。 通过此流程,您可以实施授权工作流:
- 设置请求者身份。
- 检查并获取针对特定身份提供者的身份验证。
- 检查并获取特定资源的授权。
- 注销。
AccessEnabler的网络活动发生在不同的线程中,因此从不阻止UI线程。 因此,两个应用程序域之间的双向通信渠道必须遵循完全异步模式:
- UI应用层通过
AccessEnabler库公开的API调用将消息发送到AccessEnabler域。 AccessEnabler通过UI层向AccessEnabler库注册的AccessEnabler协议中包含的回调方法响应UI层。
权利流 entitlement
A.先决条件 prereqs
-
创建回调函数:
-
- 由
setRequestor()触发,返回成功或失败。 成功表示您可以继续权利调用。
- 由
-
- 仅当用户尚未选择提供程序(MVPD)且尚未进行身份验证时,才由
getAuthentication()触发。mvpds参数是用户可用的提供程序数组。
- 仅当用户尚未选择提供程序(MVPD)且尚未进行身份验证时,才由
-
'setAuthenticationStatus(status, reason)'
-
每次由
checkAuthentication()触发。 仅当用户已验证并已选择提供程序时,才由getAuthentication()触发。 -
返回的状态已验证或未验证,原因描述了验证失败或注销操作。
-
-
- 在AmazonFireOS SDK中忽略,该方法在Android平台上使用,在此平台上由
getAuthentication()在用户选择MVPD后触发。url参数提供MVPD登录页面的位置。
- 在AmazonFireOS SDK中忽略,该方法在Android平台上使用,在此平台上由
-
'sendTrackingData(event, data)'
- 由
checkAuthentication(), getAuthentication(), checkAuthorization(), getAuthorization(), setSelectedProvider()触发。event参数指示发生的授权事件;data参数是与事件相关的值列表。
- 由
-
- 成功授权查看资源后由
checkAuthorization()和getAuthorization()触发。 token参数是短期媒体令牌;resource参数是用户有权查看的内容。
- 成功授权查看资源后由
-
'tokenRequestFailed(resource, code, description)'
- 在授权失败后由
checkAuthorization()和getAuthorization()触发。 resource参数是用户尝试查看的内容;code参数是指示所发生失败类型的错误代码;description参数描述与错误代码关联的错误。
- 在授权失败后由
-
- 由
getSelectedProvider()触发。 mvpd参数提供有关用户选择的提供程序的信息。
- 由
-
'setMetadataStatus(metadata, key, arguments)'
- 由
getMetadata().触发 metadata参数提供您请求的特定数据;key参数是getMetadata()请求中使用的键;arguments参数是传递给getMetadata()的同一词典。
- 由
-
- 由
checkPreauthorizedResources()触发。 authorizedResources参数表示用户有权查看的资源。
- 由
-
B.启动流程 startup_flow
-
启动上层应用程序。
-
启动Adobe Pass身份验证。
-
调用
getInstance以创建Adobe Pass身份验证AccessEnabler的单个实例。- 依赖项: Adobe Pass身份验证本机Amazon FireOS库(
AccessEnabler)
- 依赖项: Adobe Pass身份验证本机Amazon FireOS库(
-
调用
setRequestor()以建立程序员的标识;传入程序员的requestorID和(可选)Adobe Pass身份验证终结点数组。-
依赖项:有效的Adobe Pass身份验证请求者ID(请与Adobe Pass身份验证帐户管理员合作安排此过程。)
-
触发器: setRequestorComplete()回调
-
在完全建立请求者身份之前,无法完成任何授权请求。 这实际上意味着,在setRequestor()仍在运行时,所有后续的权利请求(例如,
checkAuthentication())都将被阻止。您有两个实施选项:将请求者标识信息发送到后端服务器后,UI应用程序层可以选择以下两种方法之一:
- 等待
setRequestorComplete()回调的触发(AccessEnabler委托的一部分)。 此选项可让您最确定已完成setRequestor(),因此建议对大多数实施使用此选项。 - 继续而不等待
setRequestorComplete()回调的触发,并开始发出授权请求。 这些调用(checkAuthentication、checkAuthorization、getAuthorization、getAuthorization、checkPreauthorizedResource、getMetadata、logout)由AccessEnabler库排队,将在setRequestor()之后进行实际的网络调用。 例如,如果网络连接不稳定,则此选项有时可能会中断。
-
-
调用checkAuthentication()以检查现有身份验证,而不启动完整的身份验证流程。 如果此调用成功,您可以直接进入授权流程。 如果没有,请继续进入身份验证流程。
-
依赖项:成功调用
setRequestor()(此依赖项也适用于所有后续调用)。 -
触发器: setAuthenticationStatus()回调
C.身份验证流程 authn_flow
-
调用
getAuthentication()以启动身份验证流程,或获取用户已进行身份验证的确认。触发器:
- setAuthenticationStatus()回调(如果用户已经过身份验证)。 在这种情况下,请直接进入授权流。
- displayProviderDialog()回调(如果用户尚未经过身份验证)。
-
向用户显示发送给
displayProviderDialog()的提供程序列表。 -
用户选择提供程序后,WebView将打开供用户登录的提供程序页面
note note NOTE 此时,用户可以取消身份验证流程。 如果发生这种情况, AccessEnabler将清理其内部状态并重置身份验证流程。 -
用户成功登录后,WebView将关闭。
-
调用
getAuthenticationToken(),以指示AccessEnabler从后端服务器检索身份验证令牌。 -
[可选]调用
checkPreauthorizedResources(resources)以检查用户有权查看哪些资源。resources参数是与用户的身份验证令牌关联的受保护资源的数组。触发器:
preAuthorizedResources()回调
完成身份验证流程后执行点: -
如果身份验证成功,请转到授权流。
D.授权流程 authz_flow
-
调用
getAuthorization()以启动授权流。依赖项:与MVPD约定的有效ResourceID。
注意: ResourceID应该与任何其他设备或平台上使用的相同,并且在MVPD中应该相同。
-
验证身份验证和授权。
-
如果
getAuthorization()调用成功:用户具有有效的AuthN和AuthZ令牌(用户已通过身份验证并有权观看请求的媒体)。 -
如果
getAuthorization()失败:检查引发的异常以确定其类型(AuthN、AuthZ或其他内容):- 如果这是身份验证(AuthN)错误,则重新启动身份验证流程。
- 如果是授权(AuthZ)错误,则用户无权观看请求的媒体,并且应向用户显示某种错误消息。
- 如果出现其他类型的错误(连接错误、网络错误等),则向用户显示相应的错误消息。
-
-
验证短媒体令牌。
使用Adobe Pass身份验证媒体令牌验证器库验证从上述
getAuthorization()调用返回的短期媒体令牌:- 如果验证成功:为用户播放请求的媒体。
- 如果验证失败:AuthZ令牌无效,应拒绝媒体请求,并向用户显示错误消息。
-
返回到正常应用程序流程。
E.查看媒体流 media_flow
-
用户选择要查看的媒体。
-
媒体是否受保护? 您的应用程序会检查所选媒体是否受保护:
- 如果所选媒体受到保护,您的应用程序将启动上面的授权流。
- 如果所选媒体未受保护,则为用户播放该媒体。
F.注销流程 logout_flow
-
调用
logout()以注销用户。AccessEnabler将清除用户为当前MVPD获取的所有缓存值和令牌,这些值和令牌位于共享单点登录的所有请求者上。 清除缓存后,AccessEnabler进行服务器调用以清除服务器端会话。 请注意,由于服务器调用可能会导致到IdP的SAML重定向(这允许IdP端的会话清理),因此此调用必须遵循所有重定向。 因此,此调用将在WebView控件中处理,对用户不可见。注意:注销流程与身份验证流程的不同之处在于,用户不需要以任何方式与WebView交互。 因此,可以(并且建议)在注销过程中使WebView控件不可见(即:隐藏)。