我们在此博客上研究了使用 Amazon Interactive Video Service (Amazon IVS) 创建实时流媒体体验的多种不同方法,但到目前为止,所有这些示例都集中在公共频道上,任何人都可以在没有任何播放授权的情况下观看验证是否允许观众观看直播。许多实时流媒体用户生成内容 (UGC) 平台不需要任何授权即可观看流媒体,但在某些用例中,我们希望将流媒体观众限制为一部分观众。例如,我们的内容创建者可能希望对他们制作的内容收取订阅费用。或者,流媒体内容可能存在许可限制,禁止分发到某些人口统计数据或地理位置。为了解决平台必须强制执行播放授权的用例,Amazon IVS 支持私有频道。这些频道将限制播放给已经获得用私钥签名并用公钥验证的令牌的观众。在本文中,我们将了解如何启用播放授权、创建播放密钥对、生成令牌以及播放私有流。
此工作流程的第一步是创建私人频道。创建私人频道与创建公共频道非常相似 - 唯一的区别是创建频道时启用播放授权的单一设置。我们可以通过Amazon IVS 控制台、AWS CLI 或任何 AWS SDK 启用播放授权。
让我们首先了解如何通过 Amazon IVS 控制台创建私有频道。在控制台的频道列表中,单击创建频道。
在创建频道页面上,输入频道名称 (#1),选择自定义配置(#2),然后启用启用视频播放的令牌授权要求(#3)。
如果您更喜欢使用 CLI 创建通道,则可以添加--authorized
选项。
$ aws ivs create-channel --name demo-private-channel --latency-mode LOW --type STANDARD --authorized
实际上,您可能会使用 AWS 开发工具包来创建您的用户频道。在这种情况下,您可以参考您喜欢的语言的 AWS 开发工具包文档,以确定要为authorized
播放设置的适当参数。例如,这里是适用于 JavaScript v3 的 AWS 开发工具包的CreateChannelCommandInput
文档,其中声明我们可以在创建通道时设置布尔authorized
属性。
现在我们已经启用了播放授权,如果我们要广播到频道并尝试在不生成和传递播放令牌的情况下查看实时播放,我们将收到播放错误。下面是一个使用 Amazon IVS 播放器 SDK 进行播放的示例,我们在其中添加了一个ERROR
侦听器来捕获播放错误。
const streamUrl = '[private channel Playback Url]'; const ivsPlayer = IVSPlayer.create(); ivsPlayer.attachHTMLVideoElement(document.getElementById('video-player')); ivsPlayer.load(streamUrl); ivsPlayer.play(); ivsPlayer.addEventListener(IVSPlayer.PlayerEventType.ERROR, (err) => { console.log(err); });
当指向私人频道时在浏览器中运行它会导致以下错误记录到控制台。
{ "type": "ErrorAuthorization", "code": 7, "source": "MasterPlaylist", "message": "invalid_playback_auth_token" }
这证实了我们的频道确实是私有的,并且需要生成token
并将其与播放 Url一起传递以授权播放。
在生成播放令牌之前,我们需要创建一个私钥/公钥对并将其上传到 Amazon IVS 控制台。此密钥对将用于生成JWT
令牌,该令牌使用私钥签名并使用公钥验证,以授权播放。
要使用 Amazon IVS 控制台管理播放键,请选择左侧导航栏中的播放键。
我们可以使用控制台创建密钥,也可以在本地计算机上离线使用 OpenSSL 手动创建密钥。直接在控制台中创建密钥对。为此,单击创建播放密钥。
为密钥命名,然后单击Create 。
此对的公钥保存到您的 AWS 账户,并将用于验证任何包含用私钥签名的令牌的播放请求。使用 Amazon IVS 控制台生成密钥对时,私钥会立即下载到您的机器上,不会保存在控制台中或可供进一步下载。
如果您更愿意创建自己的密钥对,可以离线进行,然后将公钥导入 Amazon IVS 控制台。下面是使用 OpenSSL 创建密钥对的示例。
$ openssl ecparam -name secp384r1 -genkey -noout -out demo-private-channel-private-key-1.pem $ openssl ec -in demo-private-channel-private-key-1.pem -pubout -out demo-private-channel-public-key-1.pem
要导入公钥,请单击播放密钥列表页面上的导入。
为导入的密钥命名,然后浏览公钥文件(或粘贴公钥文件内容)。
这也可以通过 AWS CLI 完成:
$ aws ivs \ import-playback-key-pair \ --name demo-private-channel-playback-key-1 \ --public-key-material "`cat /path/to/your/public-key.pem`"
或者通过 AWS SDK(JavaScript 示例的文档)。
现在我们已经创建了一个私人频道和一个播放密钥对,我们准备好生成签名的播放授权令牌。在您的应用程序中,您的业务逻辑将决定应向哪些用户授予授权令牌。如上所述,也许您的应用程序逻辑将首先通过查询数据库来检查用户是否是频道的有效订阅者。或者,在地理限制的情况下,您可能必须查找查看器的 IP 地址以确保它与能够查看流的区域相关联。确切的实现会有所不同,但是一旦您确定查看者是否确实被授权查看流,您就可以继续使用下面描述的令牌生成方法。
注意:令牌生成将根据您在后端使用的语言而有所不同。有关要求的详细信息,请参阅用户指南。
要使用 Node.js 生成令牌,我们可以使用jsonwebtoken
库 ( docs )。该库将简化流程,并允许我们按照 Amazon IVS 的要求使用SHA-384
签名算法对我们的有效负载进行签名。我们的有效负载必须包含Channel ARN 、用于将播放限制在特定域(或*
表示所有域)的access-control-origin
以及令牌过期时间戳。为了对有效载荷进行签名,我们将其格式化如下,并使用我们在上面创建和导入的私钥。
注意:令牌用于在私有频道开始播放,因此有效期仅适用于令牌生成和播放开始之间的时间。它与用户可以播放给定流的时间量无关。一旦授权播放,它可以继续,直到用户断开连接或重新加载网页。
这是使用 Node.js 在后端(通过微服务或无服务器应用程序)生成令牌的一种方法。
import jwt from "jsonwebtoken"; const getToken = () => { const privateChannelArn = process.env.DEMO_PRIVATE_CHANNEL_ARN; // private channel ARN const privateChannelPrivateKey = process.env.DEMO_PRIVATE_CHANNEL_PRIVATE_KEY; // playback private key const payload = { "aws:channel-arn": privateChannelArn, "aws:access-control-allow-origin": "*", "exp": Date.now() + (60 * 1000), // expires in 1 minute }; const token = jwt.sign(payload, privateChannelPrivateKey, { algorithm: 'ES384' }); return token; }
在我们的前端,我们可以从后端检索令牌并将其附加到私有频道的Playback Url 。在下面的示例中,为简洁起见,我截断了播放 Url ( streamUrl
)。
const streamUrl = `https://[truncated].m3u8?token=${token}` const ivsPlayer = IVSPlayer.create(); ivsPlayer.attachHTMLVideoElement(document.getElementById('video-player')); ivsPlayer.load(streamUrl); ivsPlayer.play();
在这篇文章中,我们学习了如何创建私人频道、创建和导入播放密钥对以及生成用于播放授权的 JWT 令牌。要了解有关私人频道的更多信息,请参阅用户指南。