Руководство по исправлению · Тест микрофона
Как исправить «SecurityError» и «navigator.mediaDevices is undefined»
Браузеры разрешают доступ к микрофону и камере только на защищённых страницах. Если адрес начинается с http:// вместо https:// или страница находится во фрейме без разрешения, браузер выбрасывает SecurityError либо полностью скрывает navigator.mediaDevices, что приводит к «TypeError: Cannot read properties of undefined (reading getUserMedia)». Решение — использовать защищённый адрес.
Чек-лист быстрого исправления
- 1Посмотрите на адресную строку. Страница должна начинаться с https:// или быть localhost.
- 2Замените http:// на https:// в адресе или заново откройте сайт по защищённой ссылке.
- 3Если вы внутри приложения или встроенного просмотра, откройте страницу в обычной вкладке браузера.
- 4Разрешите микрофон и камеру для сайта, перезагрузите страницу и снова нажмите «Проверить».
- 5Если вы управляете сайтом, установите сертификат и перенаправьте весь http-трафик на https.
Почему браузерам нужен защищённый контекст
Микрофон и камера — чувствительные устройства. Браузеры дают к ним доступ только в защищённом контексте, чтобы злоумышленник в общей сети не мог подменить страницу и следить за вами. Обычные http-страницы, адреса локальной сети вроде 192.168.x.x и многие встроенные в приложения просмотры не подходят, а localhost подходит.
Политика разрешений также может блокировать устройство для страницы во фрейме. Размещающая страница должна разрешить микрофон и камеру для этого фрейма.
Чек-лист разработчика
Отдавайте сайт по HTTPS с действительным сертификатом, проверяйте локальную работу на localhost и сверяйтесь с window.isSecureContext перед вызовом getUserMedia. Для встраиваний задайте allow="microphone; camera" в iframe и избегайте sandbox, удаляющих разрешение. Проверка микрофона отдаётся по HTTPS, так что можно сравнить.
FAQ
Частые вопросы
Почему navigator.mediaDevices равен undefined?
Страница не в защищённом контексте, поэтому браузер скрывает медиа-API. Откройте её по HTTPS или на localhost.
Считается ли localhost безопасным?
Да. Браузеры считают localhost защищённым, так что можно разрабатывать без сертификата. Другим локальным адресам нужен HTTPS.
Что такое SecurityError в getUserMedia?
Браузер отказал, потому что страница небезопасна, загружена в ограниченном фрейме или политика запрещает устройство.
Безопасны ли мои данные на http-странице?
Не используйте микрофон и камеру на http-страницах. Применяйте https, чтобы страницу нельзя было подменить по пути.