O blog da AWS
Protegendo seu streaming de vídeo com autenticação por token
Por Osmar Bento, Arquiteto de Soluções AWS Brasil,
Arturo Velasco, Arquiteto de Soluções AWS Brasil e
Gustavo Barbosa é Arquiteto de Soluções da AWS Brasil.
A cada dia, mais companhias estão construindo workflows de mídia, streaming de vídeo, ao vivo ou on-demand. Transmissões de vídeo se tornaram uma ferramenta padrão no mercado para alcançar seu público alvo, não sendo mais uma exclusividade de conglomerados de mídia. Escolas, empresas de tecnologia, bancos, lojas de varejo, pequenas, médias e grandes estão criando conteúdos de mídia e distribuindo diretamente para os espectadores. Com o crescimento exponencial do conteúdo de mídia, bem como o seu valor, criar estratégias para protege-lo vem se tornando cada vez mais importante, tanto para proteger os direitos autorais do conteúdo, quanto para garantir a entrega somente ao público alvo.
Métodos de autorização do Amazon CloudFront
Companhias que distribuem conteúdo via internet, precisam proteger seu conteúdo, prevenindo a redistribuição não autorizada em meios digitais. Com o Amazon CloudFront você pode distribuir conteúdos privados com URL’s assinadas ou cookies assinados. Você também pode usar autenticação por token via Lambda@Edge na sua distribuição. Lambda@Edge é uma funcionalidade do Amazon CloudFront que permite você execute código perto dos usuários da sua aplicação, dessa forma reduz latência e aumenta a performance. O Amazon CloudFront, oferece diferentes estratégias para proteger o conteúdo:
- Você pode restringir o acesso aos conteúdos privados utilizando URL’s assinadas, ou cookies assinados na distribuição do CloudFront.
- Requerer que o usuário acesse o conteúdo utilizando uma URL’s do CloudFront, ao invés de acessarem uma URL’s diretamente da fonte, (como uma URL de um bucket do Amazon Simple Storage Service (Amazon S3)). Usar uma URL do CloudFront não é necessário, mas nós recomendamos para que previna de usuários passarem pelas suas barreiras de segurança que forem criadas, como URL’s assinadas ou cookies assinados
- Você ainda pode acionar uma função do Lambda para autorizar cada solicitação do visualizador chamando o serviço de autenticação e gerenciamento de usuários, como o Amazon Cognito.
Nessa publicação, vamos implementar autorização via web token na distribuição do CloudFront usando Lambda@Edge, protegendo o streaming de vídeo ao vivo ou on-demand OTT.
JSON Web Tokens com Lambda@Edge
Lambda@Edge é um recurso do Amazon CloudFront que permite executar o código mais próximo dos usuários do seu aplicativo, o que melhora o desempenho e reduz a latência. Com o Lambda@Edge, você não precisa provisionar ou gerenciar a infraestrutura em vários locais ao redor do mundo. Você paga apenas pelo tempo de computação utilizado. Não haverá cobranças quando o código não estiver em execução.
Podemos aplicar as funções Lambda@Edge para interceptar as requisições e respostas para o Amazon CloudFront nos seguintes termos:
- Depois que o CloudFront receber uma requisição de um visualizador (viewer request)
- Antes do CloudFront encaminhar a requisição para a origem (origin request)
- Depois do CloudFront receber a resposta da origin (origin response)
- Antes do CloudFront encaminhar a resposta ao visualizador (viewer response)
Arquitetura Proposta
Componentes da Solução
Nessa sessão vamos nos aprofundar na implementação da aplicação WEB (no repositório do GitHub) bem como implementar os componentes de nuvem para autenticação, validação de token e caching na CDN.
Para sustentar o back-end e front-end na AWS usaremos o AWS Amplify, uma solução end-to-end que possibilita desenvolvedores de aplicações mobile e web construir e automatizar o deployment de forma segura e escaláveis, você consegue configurar o back-end em minutos, conecta tudo ao seu app apenas algumas linhas de código. E faz o deploy de sites estáticos em três passos.
A aplicação Web é construída em React e usa Video.JS como o player de vídeo
Depois da autenticação exitosa, o Amazon Cognito retorna os tokens do user pool para a sua aplicação. Então estes tokens podem ser utilizados para garantir o acesso para aos recursos no back-end, nesse cenário, o token será usado para fazer o login para os que requisitarem conteúdos de mídia privados, essa requisição será analisada pela função no Lambda@Edge e validadas contra os parâmetros de autenticação do Cognito.
Deployment da Solução
1. Dependências do projeto
Para a integração com os componentes da AWS e o hosting da nossa aplicação web usaremos AWS Amplify. Para verificar um passo a passo completo da instalação e configuração do AWS Amplify, por favor visite a documentação (Amplify para React).
npm install -g @aws-amplify/cli amplify configure
2. Clone o repositório
git clone https://github.com/osmarbento-AWS/secure-url-cf.git cd secure-url-cf npm install amplify init --app https://github.com/osmarbento-AWS/secure-url-cf.git amplify init amplify push
3. Inicie o ambiente local
npm start
Isso deve fazer com que você possa acessar a página de autenticação. Agora crie a sua conta na página de login. Depois do login, deve carregar o site abaixo:
4. Prepare o ambiente para hospedar e transcodificar vídeos
Utilizaremos o Amplify Video para criação da infraestrutura de nuvem para hospedar e transcodificar conteúdos On-Demand, Amplify Video é uma ferramenta open-source para o amplify CLI, isso faz com que seja mais fácil para incorporar streaming de vídeo nas suas aplicações web ou aplicações mobile. Desenvolvida pelo time AWS Media Services.
Amplify Video também suporta conteúdo ao vivo. Para mais informações e exemplos, por favor visite amplify-video GitHub.
npm i amplify-category-video -g amplify add video ? Please select from one of the below mentioned services: Video-On-Demand ? Provide a friendly name for your resource to be used as a label for this category in the project: vod-wf-jwt ? Select a system-provided encoding template, specify an already-created template name: Default HLS Adaptive Bitrate ? Is this a production enviroment? Yes ? Do you want to protect your content with signed urls? No ? Do you want Amplify to create a new GraphQL API to manage your videos? (Beta) No ✔ All resources built. amplify push
Amplify Video vai criar um bucket S3 para que seja armazenado os arquivos de vídeo de origem e destino para o conteúdo de mídia, também irá fazer o deployment de uma distribuição de CloudFront. Abaixo o exemplo de resultado do amplify push
:
Video on Demand: Input Storage bucket: vodcfjwt-dev-input-SOMEID Output URL for content: https://someid.cloudfront.net (https://someid.cloudfront.net/
Nota: Amplify Video também oferece a opção de proteção de conteúdo com URL assinada, você pode encontrar mais informações de como usar as URL’s assinadas com o amplify video em primeiros passos com VOD.
Testando o transcoding
Navegue até o console do S3. Note que o Amplify Video criou dois buckets no seu ambiente de desenvolvimento. Busque o input bucket e faça o upload de um arquivo .mp4 que você tenha armazenado no seu computador local.
Uma vez que o arquivo estiver no bucket, navegue até o MediaConvert e veja os jobs de transcoding. Essa task pega os arquivos de origem e faz o transcoding para Apple HTTP live streaming Protocol (HLS), e os arquivos depois do transcoding vão para o bucket de saída, que estão servindo como origem para a distribuição do CloudFront.
Testando o Media Playback
Depois que o MediaConvert completou o transcoding, volte para o console do S3, e localize o bucket de saída. Depois, localize o arquivo com o mesmo nome do qual você fez o upload original. Você verá os arquivos de saída criados pelo MediaConvert. Localize o manifesto HLS, será o arquivo com a extensão .m3mu8, depois substitua o domínio do S3 pela URL de saída do conteúdo.
O formato da URL executável deve ser, a URL de saída do conteúdo + /nome do ativo/ + nome do ativo.m3mu8
Exemplo: https://someid.cloudfront.net/BigBuckBunny/BigBuckBunny.m3u8
5. Adicione a autenticação do JSON Web Token na sua distribuição do CloudFront
a. Instale as dependências da autenticação na função Lambda@Edge
cd amplify/backend/function/jwtauth/src/ npm install
b. Edite o arquivo index.js da função e adicione os atributos do Cognito User Pool
Abra o arquivo config.js, localizado em:
amplify/backend/function/jwtauth/src/config.js
Liste os recursos de autorização criados pelo Cognito User Pool ID
amplify auth console Using service: Cognito, provided by: awscloudformation ? Which console User Pool User Pool console: https://us-east-1.console.aws.amazon.com/cognito/users/?region=us-east-1#/pool/us-east-SomeID/details Current Environment: dev
O user pool id pode ser encontrado na URL que retorna depois que roda o amplify auth console
Copie o Pool ID e substitua na variável USERPOOLID
var USERPOOLID = 'us-east-1_SomeID';
c. Faça o download e armazene a chave JSON web Key (JWK) correspondente com o seu user pool.
Está disponível como parte do JSON Web Key Set (JWKS). você pode encontrar em: https://cognito-idp.us-east-1.amazonaws.com/us-east-SomeID
/.well-known/jwks.json
Para mais informações do JWT e JWK, visite Cognito verificando a documentação do JSON Web Token e JSON Web Key (JWK).
Você pode ver exemplos de jwks.json na documentação do JSON Web Token. Agora substitua a variável JWKS com as suas credenciais do Cognito user pool
var JWKS = '{"keys":[{"alg":"RS256","e":"AQAB","kid":"1234exemple=","kty"::"RSA"....}]}
Agora, faça o deploy da sua função lambda simplesmente executando o comando abaixo na pasta home da aplicação:
amplify push
6. Faça o deploy do Lambda@Edge
Agora que a função faz a verificação do JWT na nuvem, você fez o deploy da sua distribuição
a. vá no console do CloudFront, e copie a ARN da distribuição que foi criada no passo 5
b. vá até a console do Lambda, e faça deploy da função no Lambda@Edge
Pronto, agora já podemos executar os testes fim-a-fim.
7. Testes fim-a-fim
Agora abra a sua aplicação web, e teste algum conteúdo.
No campo vídeo URL, adicione a URL completa do seu output que foi criado no passo 5.
Conclusão
Nesse blog, nós discutimos as estratégias de proteção dos seus conteúdos de mídia por autenticação de token JWT. Isso ajuda a reduzir acessos não autorizados do seu conteúdo digital. Para mais conteúdo, veja a documentação do Amazon CloudFront para encontrar formas adicionais de proteger o seu conteúdo.
Links Adicionais:
- Private channels for Amazon Interactive Video Service: https://aws.amazon.com/pt/blogs/media/introducing-private-channels-for-amazon-interactive-video-service/
- AWS Amplify Video: https://aws.amazon.com/blogs/media/introducing_aws_amplify_video/
- Amazon CloudFront using signed URLs: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html
- Código sample para verificar autenticação no edge https://github.com/aws-samples/cloudfront-authorization-at-edge
Sobre os autores:
Osmar Bento é um Arquiteto de Soluções especialista em Mídia e entretenimento. ele ajuda os clientes da AWS a construir soluções inovadoras usando a plataforma AWS.
Arturo Velasco é um Arquiteto de Soluções especialista em Mídia e entretenimento, com mais de 9 anos de experiência na indústria. Seus objetivos são ajudar os clientes a entenderem como eles podem usar os serviços da AWS, melhores práticas e evangelizar as soluções de mídia e entretenimento da AWS.
Gustavo Barbosa é Arquiteto de Soluções da AWS para SMB. Ajuda seus clientes a construirem aplicações resilientes e altamente disponíveis com os serviços que a plataforma da AWS oferece.