Как сделать HTTP-запрос GET видеопотока в тег img html с помощью axios?

У меня есть бэкэнд Django 2.1 с конечной точкой видеопотока и Vue-Cli3 в качестве интерфейса. Конечная точка видеопотока в моем бэкэнде - это запрос GET. Чтобы потоковая передача работала на моей стороне клиента, мне нужно было добавить:

<img :src="$store.state.domain + 'cameras/video/' + camera.properties.name + '/'" width="240" alt="Camera live Stream">

Это работает нормально, но теперь я должен защищать свой внутренний маршрут только для аутентифицированных пользователей. Для этого мне просто нужно добавить токен аутентификации в заголовок запроса. Согласно настраиваемый заголовок для запрос сделан из тега ‹img /›, тег img не принимает параметры заголовка. Итак, теперь я пытаюсь создать запрос, используя библиотеку axios, а затем передать результат запроса в свой HTML-тег img. мой код метода Vue до сих пор:

  loadStream(){
    const vm = this
    let accessToken = vm.$store.getters.getAccessToken
    let streamURL = `${vm.$store.state.domain}/cameras/video/${vm.camera.properties.name}/`

    axios.get(streamURL, {headers: {"Authorization": `Bearer ${accessToken}`},
                          responseType: 'stream', 
                          adapter: httpAdapter}


    ).then( response =>{

      console.log(`success:${response.data}`)

      let imgTag = document.createElement('img')
      imgTag.src = URL.createObjectURL(response)
      imgTag.classList.add('video-modal', 'popup-video')
      imgTag.alt = `Camera ${camera.properties.name} liveStream`
      imgTag.setAttribute("crossorigin", '')
      let streamDiv = document.getElementById('livestream-img')
      streamDiv.appendChild(imgTag)

    }).catch( error => {
      console.log(`error:${response.data}`)

      let imgTag = document.createElement('img')
      imgTag.alt = `Camera ${camera.properties.name} liveStream`
      let streamDiv = document.getElementById('livestream-img')
      streamDiv.appendChild(imgTag)

    })
  }

Все, что я получаю, это предупреждение: Предупреждение: предоставленный поток значений не является допустимым значением перечисления введите XMLHttpRequestResponseType.

Также моя просьба никогда не заканчивается. Promise никогда не попадет в .then () или .catch (), потому что он потоковый. Похоже, что responseType не работает должным образом. я что-то упускаю?

Это моя конечная точка бэкэнда django:

class CameraVideoStreamingView(APIView):

    def get(self, request, name):

        cam = Camera.objects.get(name=name)
        return StreamingHttpResponse(cam.serve_web_stream(),
                                     content_type="multipart/x-mixed-replace;boundary=frame")

person Marcelo Fonseca    schedule 24.10.2018    source источник
comment
Привет, @Marcelo. Вы нашли какое-нибудь решение этой проблемы? Я тоже ищу то же самое.   -  person divyansh ingle    schedule 31.10.2018
comment
Привет @divyansh ingle, пока нет. Я думал о решении ARJMP, но мне было интересно, может ли оно позволить токену подвергаться воздействию любого сниффера, который мог бы позволить кому-то получить действительный токен аутентификации. Я нашел вопрос об этой проблеме безопасности в обмене безопасностью: security.stackexchange.com/questions/158541/   -  person Marcelo Fonseca    schedule 01.11.2018


Ответы (1)


Я бы порекомендовал отправить какой-то токен аутентификации в параметрах запроса видео и для этого реализовать пользовательский Класс аутентификации токена, который получает токен из параметра запроса, а не из заголовков. Затем вам нужно будет обновить свойство authentication_classes вашего представления новым классом аутентификации.

person A. J. Parr    schedule 25.10.2018
comment
Привет, @ARJMP, извините за поздний ответ. Я думал о решении, но мне было интересно, может ли это позволить токену подвергнуться воздействию любого вида сниффера, который мог бы позволить кому-то получить в свои руки действительный токен аутентификации. Я нашел вопрос об этом в обмене безопасностью здесь: security.stackexchange.com/questions/158541/ - person Marcelo Fonseca; 01.11.2018