因此,基本上我想通过我的websocket获得身份验证,并且需要身份验证所需的cookie,因此如何将请求的cookie发布到js中的websocket中。
这是我的代码
var uri = 'ws://' + window.location.hostname + window.location.pathname.replace('default.htm', '') + 'chat.ashx?username=' + username;
websocket = new WebSocket(uri);
Run Code Online (Sandbox Code Playgroud) 我的 API 管理器工具要求我应该通过 websocket 调用传递授权承载访问令牌。他们在其中提供了 Java 代码示例。
不记名令牌设置为 ("Authorization", "Bearer e2238f3a-e43c-3f54-a05a-dd2e4bd4631f") 。我如何在 javascript 中做到这一点?
// HttpResponseDecoder to WebSocketHttpResponseDecoder in the pipeline.
final WebSocketClientHandler handler = new WebSocketClientHandler(
WebSocketClientHandshakerFactory
.newHandshaker(uri, WebSocketVersion.V13, null,
false, new DefaultHttpHeaders()
.add("Authorization", "Bearer e2238f3a-e43c-3f54-a05a-dd2e4bd4631f")));
Run Code Online (Sandbox Code Playgroud)
这就是他们在 java 中的做法 有没有办法从我的 java 脚本 [Angular2] Web 应用程序中做到这一点?我如何从 UI 传递这个?任何基于 Websocket 的测试工具都可以模拟这一点?
我不知道如何使用令牌身份验证连接和身份验证 django 通道,因为 javascript websockets 不支持将标头传递给服务器
class TokenAuthMiddleware:
"""
Token authorization middleware for Django Channels 2
"""
def __init__(self, inner):
self.inner = inner
def __call__(self, scope):
headers = dict(scope['headers'])
if b'authorization' in headers:
try:
token_name, token_key = headers[b'authorization'].decode().split()
if token_name == 'Token':
token = Token.objects.get(key=token_key)
scope['user'] = token.user
except Token.DoesNotExist:
scope['user'] = AnonymousUser()
return self.inner(scope)
TokenAuthMiddlewareStack = lambda inner: TokenAuthMiddleware(AuthMiddlewareStack(inner))
Run Code Online (Sandbox Code Playgroud)
我找到了有关使用令牌进行身份验证的答案,但问题是我不明白如何将标头传递给服务器
token = Token.objects.get(key='175f76fd9b63a9477bf5f9a6f2e9a7f12ac62d65')
if token.user:
scope['user'] = token.user
else:
scope['user'] = AnonymousUser()
return self.inner(scope)
TokenAuthMiddlewareStack = lambda inner: TokenAuthMiddleware(AuthMiddlewareStack(inner)) …Run Code Online (Sandbox Code Playgroud) 我需要一个javascript库连接到我的web-socket服务器,这是使用python twisted实现的.我尝试了Native javascript web-socket客户端,但它没有根据此链接传递自定义标头的选项.我的Web套接字服务器通过从Oauth2标准中的握手头中获取auth_token来进行身份验证.是否有任何javascript库可用于Web套接字客户端,允许在连接时传递自定义标头?
嗨,我的代码在 Nodejs 中看起来像这样,它有效!
但是当我尝试在 nwjs 应用程序中使用完全相同的代码时,却没有!因为当我嗅探并看到它认为它在网络浏览器下运行并且它尝试使用 nwjs 的 chromium 浏览器的本机功能时。
function connecttest(domain)
{
socket = require('socket.io-client')('https://ws.'+domain.replace('www.').replace('m.'),{
forceNode:true,
transports: ['websocket'],
extraHeaders: {
'Origin': 'https://www.'+domain.replace('www.').replace('m.')
},
transportOptions: {
polling: {
extraHeaders: {
'Origin': 'https://www.'+domain.replace('www.').replace('m.')
}
}
}
});
socket.on('connect', function(socket){
console.log("ok");
socket.emit('query', {"body":{"siteId":"9","source":1,"lang":"tr"},"action":"site.session","frontEndId":0,"token":null});
socket.on('response', function(data){
console.log(data);
});
});
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它无法设置正确的原始标头
但它可以在普通的nodejs脚本下工作
我正在尝试从前端到 vertx 后端建立 sock.js 连接。
我最初的尝试是这样的:
let token = '<the token>';
let data = {'Authorization' : 'Bearer ' + token};
let eb = new EventBus("http://localhost:8080/eventbus");
eb.onopen = function () {
eb.registerHandler('notifications', data, (err, msg) => {
// handle the response
});
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为我需要发送有关 EventBus 创建的身份验证数据,即使官方 sock.js 文档指出这不受支持。显然现在发送new EventBus("http://localhost:9090/eventbus", data)也不起作用。
https://github.com/sockjs/sockjs-node#authorisation
我的后端处理程序:
final BridgeOptions bridgeOptions = new BridgeOptions()
.addOutboundPermitted(new PermittedOptions().setAddress("notifications"))
final SockJSHandler sockJSHandler = SockJSHandler.create(vertx).bridge(bridgeOptions, event -> {
event.complete(true);
});
router.route("/eventbus/*").handler(ctx -> {
String token = ctx.request().getHeader("Authorization"); // null …Run Code Online (Sandbox Code Playgroud) 我正在开发一个实时 websocket 应用程序,其中服务器使用 .Net 核心进行编码,而客户端可以使用多种不同的语言。我决定保护服务器的方式是 JWT,即只接受来自具有有效 JWT 的请求的套接字连接。我可以用 .Net 客户端成功地做到这一点,这是我的代码:
_client = new WebSocket("ws://localhost:8080/api/SocketDock","",null,new List<KeyValuePair<string, string>>()
{ new KeyValuePair<string, string>(
"Authorization", "Bearer eyJhbGciOiJIUzI1.....")
});
Run Code Online (Sandbox Code Playgroud)
这与 .net 核心客户端 websocket 完美配合。但是,我无法对 Angular 客户端做同样的事情。我以某种方式浏览了几篇文章,最终得到了不可能的答案。然而,在我看来,如果协议或握手在一种语言中是可能的,那么在其他语言中也必须是可能的。
有人可以指导我以正确的方式与任何 Angular 客户端实现相同的目标吗?