是否可以对websocket升级请求使用承载认证?

w.b*_*ian 20 authentication authorization websocket

打开websocket连接的升级请求是标准HTTP请求.在服务器端,我可以像其他任何一样对请求进行身份验证.就我而言,我想使用Bearer身份验证.不幸的是,在浏览器中打开websocket连接时无法指定标头,这会让我相信使用承载身份验证来验证Web套接字升级请求是不可能的.所以 - 我错过了什么,还是真的不可能?如果不可能,这是设计,还是在websocket API的浏览器实现中明显疏忽?

Kal*_*lle 27

API允许您准确设置一个标头,即Sec-WebSocket-Protocol,即特定于应用程序的子协议.您可以使用此标头传递持有者令牌.例如:

new WebSocket("ws://www.example.com/socketserver", ["access_token", "3gn11Ft0Me8lkqqW2/5uFQ="]);
Run Code Online (Sandbox Code Playgroud)

服务器应该接受其中一个协议,因此对于上面的示例,您只需验证令牌并使用标头Sec-WebSocket-Protocol = access_token进行响应.

  • 我想这取决于你的观点,它是一个功能还是一个黑客,但它意味着一个*应用程序特定的*子协议,所以应用程序可以请求和使用标头,但它喜欢。 (2认同)

Rom*_* F. 12

你是对的,由于Javascript WebSocket API的设计,现在不可能使用Authentication头.可在此主题中找到更多信息: Websockets客户端API中的HTTP标头

但是,Bearer身份验证类型允许名为"access_token"的请求参数:http://self-issued.info/docs/draft-ietf-oauth-v2-bearer.html#query-param 此方法与websocket连接兼容.

  • 该文档告诉您它不安全,除非绝对必要,否则不要使用它。 (3认同)