Icecast用户身份验证和Web音频API

如何解决Icecast用户身份验证和Web音频API

我运行了一个Icecast2服务器,使用Web Audio API可从我的网站上获取流。我想使用Icecast User Basic Auth设置私人流。可以使用以下网址访问这些流:http:// Username:Password@example.com/stream。

我面临的问题是,如果可能的话,我想将URL作为http://example.com/stream传递给WEB音频API并使用XMLHTTPRequest进行身份验证;但是,该请求未通过CORS预检,因此我不确定是否正确设置了标头。

请注意,我还尝试在不使用任何请求的情况下提供带有用户名和密码的URL,并获得消息:The HTMLMediaElement passed to createMediaElementSource has a cross-origin resource,the node will output silence.因此,我想无论如何我都需要发送请求。

我目前正在我的本地网络上对此进行测试。 Icecast服务器在Linux上运行,而我正在测试的网页在Windows上使用IIS运行。 Icecast ip为192.168.1.30:6048,而IIS位于127.0.0.1:80

以下是我的Icecast配置文件和我正在使用的XMLHTTPRequest的相关部分。我目前还在测试中,在Icecast配置中关闭了全局标头:

<mount>
    <mount-name>/test-stream.ogg</mount-name>
    <authentication type="htpasswd">
        <option name="filename" value="/usr/share/icecast2/user_auth"/>
        <option name="allow_duplicate_users" value="0"/>
    </authentication>
    <http-headers>
        <header name="Access-Control-Allow-Credentials" value="true" />
        <header name="Access-Control-Allow-Origin" value="http://127.0.0.1" />
        <header name="Access-Control-Allow-Headers" value="Authorization" />
        <header name="Access-Control-Allow-Methods" value="GET,OPTIONS" />
    </http-headers>
</mount>
window.onload = function() {
    let username = "User1";
    let password = "Pass1";

    let xhr = new XMLHttpRequest();
    xhr.open('GET','http://192.168.1.30:6048/test-stream.ogg',true);
    xhr.withCredentials = true;
    xhr.setRequestHeader('Origin','http://127.0.0.1');
    xhr.setRequestHeader ("Authorization","Basic " + btoa(username + ":" + password));
                
    xhr.onload = function() {
        // Do Stuff...
    }
    xhr.send(null);
}

解决方法

尝试将其添加到Icecast配置文件的顶部(这将启用* CORS)

<icecast>
    <http-headers>
        <header name="Access-Control-Allow-Origin" value="*" />
        <header name="Access-Control-Allow-Headers" value="Origin,Accept,X-Requested-With,Content-Type,If-Modified-Since" />
        <header name="Access-Control-Allow-Methods" value="GET,OPTIONS,HEAD" />
    </http-headers>
    <limits>
...
,

经过一堆的设置和进一步研究后,我发现尝试在本地主机上的Web服务器上使用Icecast身份验证似乎存在一些未指定的问题。

我能够通过将所有内容移至公共服务器并向Icecast添加SSL来解决该问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?