Я защищаю конечную точку. Мне нужно передать токен jwt в заголовке запроса Http Get от Angular для потоковой передачи видео.
Конечная точка в основном контроллере do tnet выглядит следующим образом (упрощенно):
[Route("api/GetVideo/{videoId}")]
public async Task<IActionResult> GetVideoAsync(int videoId)
{
string videoFilePath = GiveMeTheVideoFilePath(videoId);
return this.PhysicalFile(videoFilePath, "application/octet-stream", enableRangeProcessing: true);
}
Angular код: video.component. html
<video width="100%" height="320" crossorigin="anonymous" controls #videoElement>
<source
[src]="'http://mydomain/api/GetVideo/1' | authVideo | async" type="application/octet-stream"
/>
</video>
video.pipe.ts
@Pipe({
name: 'authVideo',
})
export class AuthVideoPipe implements PipeTransform {
constructor(private http: HttpClient, private auth: AuthTokenService) {}
transform(url: string) {
return new Observable<string>(observer => {
const token = this.auth.getToken(); //this line gets the jwt token
const headers = new HttpHeaders({ Authorization: `Bearer ${token}` });
const { next, error } = observer;
return this.http.get(url, { headers, responseType: 'blob' }).subscribe(response => {
const reader = new FileReader();
reader.readAsDataURL(response);
reader.onloadend = function() {
observer.next(reader.result as string);
};
});
});
}
}
Он действительно делает запрос на получение к конечной точке с указанным выше кодом. И что-то возвращается во фронтенд. Но видео не воспроизводится. Я нашел указанный выше способ из этого SO вопроса . Это работает для изображений, но явно не работает для видео. Я думаю, что мне может потребоваться побайтно читать потоки во внешнем интерфейсе. Если да, то как мне это сделать?
Я пробовал изменить «application / octet-stream» на «video / mp4» на обоих концах. Но не повезло.
Обратите внимание, что когда я удалил код безопасности из серверной части и удалил канал authVideo из html, он работает отлично. Пожалуйста, пролей на меня немного света. Спасибо!