Estou escrevendo um webapp em Angular em que a autenticação é controlada por um token JWT, o que significa que cada solicitação tem um cabeçalho de "Autenticação" com todas as informações necessárias.
Isso funciona bem para chamadas REST, mas não entendo como devo lidar com links de download para arquivos hospedados no back-end (os arquivos residem no mesmo servidor onde os serviços da web estão hospedados).
Não posso usar <a href='...'/>
links regulares, pois eles não carregam nenhum cabeçalho e a autenticação falhará. O mesmo vale para os vários encantamentos de window.open(...)
.
Algumas soluções que pensei:
- Gerar um link de download não seguro temporário no servidor
- Passe as informações de autenticação como um parâmetro de url e lide manualmente com o caso
- Obtenha os dados por meio de XHR e salve o arquivo do lado do cliente.
Todos os itens acima são menos que satisfatórios.
1 é a solução que estou usando agora. Não gosto disso por dois motivos: primeiro não é o ideal em termos de segurança, segundo funciona, mas requer bastante trabalho, especialmente no servidor: para baixar algo, preciso chamar um serviço que gera um novo "aleatório "url, armazena em algum lugar (possivelmente no banco de dados) por algum tempo e o devolve ao cliente. O cliente obtém o url e usa window.open ou semelhante com ele. Quando solicitado, o novo url deve verificar se ainda é válido e, em seguida, retornar os dados.
2 parece pelo menos tanto trabalho.
3 parece muito trabalhoso, mesmo usando as bibliotecas disponíveis, e muitos problemas potenciais. (Eu precisaria fornecer minha própria barra de status de download, carregar o arquivo inteiro na memória e então pedir ao usuário para salvar o arquivo localmente).
A tarefa parece bastante básica, então estou me perguntando se há algo muito mais simples que eu possa usar.
Não estou necessariamente procurando uma solução "do jeito Angular". Javascript regular seria bom.