我找到了一个简单的解决方案,使用WebSocket和Web应用程序的自定义标头,基于PHP作为后端,js + vuejs作为前端.
我的应用程序应该连接到基于Java的WebSocket服务器以获取实时统计信息.受Oauth2保护的WebSocket服务器.所以我的应用程序应该添加标题
"授权:持票人647d14-b132-41b9-aa4c-9eafad5d9630"
连接到WS服务器时.但我无法添加此标头,因为浏览器不支持自定义标头.回答关于Websockets客户端API中自定义标头HTTP标头的问题
我需要类似下面的代码
var serverWs = "ws://servername/stat"; var opts = { reconnection: false, transports: ['websocket'], extraHeaders: { 'Authorization': 'Bearer xxxx' } } var ws = new WebSocket(serverWs, opts);
Run Code Online (Sandbox Code Playgroud)
有什么解决方案?
我正在尝试与需要基本访问身份验证的 Web 套接字建立连接(客户端)。从文档中我知道我应该使用带有 base64 加密的用户名和密码。它是 node.js 应用程序,所以我决定使用 npm 包 SockJS-client。这似乎是一个很好的解决方案,因为:
在底层,SockJS 尝试首先使用原生 WebSockets。如果失败,它可以使用各种特定于浏览器的传输协议,并通过类似 WebSocket 的抽象来呈现它们。
但我不知道如何使用基本访问身份验证建立连接。我已经尝试过这里的解决方案,但是这个
var ws = new WebSocket("ws://username:password@example.com/service");
Run Code Online (Sandbox Code Playgroud)
不起作用,我收到如下错误:
语法错误:URL 的方案必须是“http:”或“https:”。'ws:' 是不允许的。
当我尝试使用http/https 时,我得到:
错误:InvalidStateError:尚未建立连接
当我试图打电话时
sock.send('test');
Run Code Online (Sandbox Code Playgroud)
另一个像下面这样的解决方案是不可能实现的,因为我无法访问 Web Socket 的服务器端。
var ws = new WebSocket("ws://example.com/service?key1=value1&key2=value2");
Run Code Online (Sandbox Code Playgroud)
我不知道如何正确建立与 Web Socket 的经过身份验证的连接,如果您知道任何解决方案,请告诉我。
我正在使用 rxjs 在我的 Angular 应用程序中使用 websocket。
我像这样实例化它:我想添加一些标题:
myheader : "abcde"
Run Code Online (Sandbox Code Playgroud)
我是怎么做的?
这是我的代码:
import { BehaviorSubject, of, Subscription, Subject, Observable, NextObserver } from 'rxjs';
@Injectable()
export class WebsocketService {
openConnection() {
this.close();
const url = 'wss://echo.websocket.org';
this.connection$ = webSocket({
url,
openObserver: this.openObserver,
closeObserver: this.closeObserver,
});
this.getmsg();
}
}
Run Code Online (Sandbox Code Playgroud)
建议?
我目前正在使用WebSockets和PHP服务器:它适用于谷歌Chrome和Opera,但不适用于Firefox 6.
我认为这是由于最后一次使用的协议版本:我看到它使用的是第七版,而对于Google Chrome和Opera来说它是较旧版本.
因此,我修改了我的服务器代码以管理这个新版本:通过使用258EAFA5-E914-47DA-95CA-C5AB0DC85B11和其他东西散列安全密钥,Firefox成功连接.但是如果另一个客户想要连接(甚至是另一个Firefox),那么第一个用Firefox连接自己.
我看到socket_recv()收到的缓冲区为空或散列...
所以我决定跳过管理Firefox 6使用的协议的想法(互联网上没有文档......!):我认为指定直接在JavaScript中使用的协议可能更容易.
在这个页面上,他们说我们可以这样写:
var mySocket = new WebSocket("http://www.example.com/socketserver", "my-custom-protocol");
Run Code Online (Sandbox Code Playgroud)
但是为了使用Google Chrome和Opera管理的协议,我们应该编写什么而不是"my-custom-protocol"?
提前致谢!
我在Chrome中打开websocket时遇到了麻烦.似乎在chrome中有一些针对websockets的CORS策略.
如果我在www.example.com上并尝试在api.example.com上打开websocket,它会在控制台网络选项卡上显示挂起,并将通过消息触发onerror WebSocket connection to 'wss://api.example.com' failed: Connection closed before receiving a handshake response.如果我查看服务器,我没有看到进行Web套接字连接的请求,因此没有选项请求响应,或者能够设置Access-Control-Allow-Origin标头.但是,如果我首先向api.example.com发出请求,请求浏览器将其重定向回www.example.com,它将正常工作.
您是否需要在chrome中使用相同的来源进行websocket请求?
注意:此问题仅适用于chrome.
我读了这篇文章http://www.asp.net/signalr/overview/security/introduction-to-security#connectiontoken
$.connection.hub.qs = { "token" : tokenValue };
$.connection.hub.start().done(function() { /* ... */ });
Run Code Online (Sandbox Code Playgroud)
var connection = new HubConnection("http://foo/",
new Dictionary<string, string>
{
{ "token", tokenValue }
});
Run Code Online (Sandbox Code Playgroud)
在Hub中,您可以通过Context访问社区名称:
Context.QueryString["token"]
Run Code Online (Sandbox Code Playgroud)
var connection = new HubConnection("http://foo/");
connection.Headers.Add("token", tokenValue);
Run Code Online (Sandbox Code Playgroud)
我注意到我们可以将一些令牌值从客户端传递给hub函数作为查询字符串.....如果我传递任何东西,因为查询字符串不安全.所以告诉我以安全的方式从客户端到集线器功能传递令牌值的最佳方法,因此没有人可以破解/更改或重用该令牌值.
一个人说SignalR uses encryption and a digital signature to protect the connection token..所以请告诉我,信号器首先加密令牌值然后从客户端传递到集线器是真的吗?
建议我如何以安全的方式将令牌值传递给集线器.谢谢
我已经在我的MVC5应用程序中实现了HTML5 Websocket。我已经使用Web API实现了此Web套接字。该代码在我的本地环境中运行良好。但这给了我测试环境以下的错误。
“与的WebSocket连接失败:HTTP身份验证失败;没有有效的凭据。”
我的服务器配置是带有IIS8的Windows Server 2012
请帮帮我。
我正在尝试建立一个经过身份验证的 websocket 连接,这个问题是服务器部分的类似问题的兄弟。当我从浏览器建立 websocket 连接时,如何添加额外的标头?
我正在尝试使用dart:html的 WebSocket 对象连接到需要authentication:包含当前身份验证令牌 (JWT)的标头来验证用户身份的服务器。问题是 WebSocket 在构造函数调用后立即建立连接,它没有任何参数来发送带有 http 请求的标头:
var ws = new WebSocket('wss://localhost:8080/ws');
Run Code Online (Sandbox Code Playgroud)
在该字符串之后,websocket 连接因错误而关闭,因为我的服务器拒绝所有在该路径的标头中不包含身份验证令牌的请求。
浏览器端是否有其他 websocket 实现可以验证 websocket 连接?
是否有可能为浏览器编写不同的 WebSocket 实现?
我不是安全专家,但是在路径请求中发送令牌而不是标头是否安全?就像是:
wss://localhost:8080/ws?token=BLAHBLAHBLAH
Run Code Online (Sandbox Code Playgroud) 我连接到代理,并使用connect命令发送一些自定义标头.这是一项要求.我收到200回复.然后我尝试使用相同的连接来执行get请求(搜索附加代码为"GET {0}")但我总是得到一个错误,最终"连接关闭"(无法回想起确切的错误).从根本上说,我需要通过像https:\ www.somesecuresite.com这样的网站来访问代码.某些部分被排除在外.
using (TcpClient client = new TcpClient(proxy, proxyPort))
{
using (NetworkStream stream = client.GetStream())
{
string EncodedData = encodeUIDPWD(UserName, Password);
#region Establish Tcp tunnel
string reqString = "CONNECT {0}:{1} HTTP/1.1\r\nProxy-Authorization:Basic " + EncodedData + "\r\nHost: {2}:{3}\r\n";
reqString += "Proxy-Connection: keep-alive\r\n";
reqString += "Connection: keep-alive\r\n";
reqString += "Header1: " + header1 + "\r\n";
reqString += "Header2: " + header2 + "\r\n";
reqString += "None: " + None + "\r\n\r\n";
string rString = String.Format(reqString, myUri.Host, myUri.Port, myUri.Host, myUri.Port);
#endregion
ServicePointManager.SecurityProtocol …Run Code Online (Sandbox Code Playgroud) 使用 localhost url 和 ws 协议时出现以下错误
[Problems] - Unexpected error: null
JMeter.plugins.functional.samplers.websocket.ServiceSocket.sendMessage(ServiceSocket.java:156)
JMeter.plugins.functional.samplers.websocket.WebSocketSampler.sample(WebSocketSampler.java:136)
org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:429)
org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257)
java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
无法像在 JMeter 中的 http 采样器中那样添加标头信息