【发布时间】:2020-11-21 19:38:44
【问题描述】:
我有安全的端点。我需要在来自 Angular 的 Http Get 请求的头部传递一个 jwt 令牌来流式传输视频。
dotnet 核心控制器中的端点如下所示(简化):
[Route("api/GetVideo/{videoId}")]
public async Task<IActionResult> GetVideoAsync(int videoId)
{
string videoFilePath = GiveMeTheVideoFilePath(videoId);
return this.PhysicalFile(videoFilePath, "application/octet-stream", enableRangeProcessing: true);
}
角度代码: 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);
};
});
});
}
}
它确实使用上面的代码向端点发出了一个 get 请求。一些东西返回到前端。但是视频没有播放。我从这个SO question 中找到了上述方法。它适用于图像,但显然不适用于视频。我的想法是我可能需要在前端逐字节读取流。如果是这样,我该怎么做?
我尝试在两端将“application/octet-stream”更改为“video/mp4”。但没有运气。
请注意,当我从后端删除安全代码并从 html 中删除 authVideo 管道时,它可以正常工作。请给我一些启示。谢谢!
【问题讨论】:
-
你是如何解决这个问题的
-
我最终将视频流端点移动到由安全服务保护的域后面。因此,无论谁在未登录的情况下打开视频端点,都会被重定向到登录页面。当用户登录时,视频可以通过普通的 HTML 视频标签进行流式传输。缺点是消费视频端点的人必须重复控制器中的代码。如果您必须创建独立的视频流服务,您可以考虑从安全的后端调用视频服务。这样您就不需要向客户端公开实际的服务端点。
-
“你可以考虑从安全的后端调用视频服务”你能告诉我更多关于这个的信息吗?这将非常有帮助。我的应用程序就像用户可以发布视频,只有登录用户才能看到视频。视频不应公开。
-
你可以先尝试只获取端点吗?
标签: javascript c# angular jwt video-streaming