【发布时间】:2015-03-22 02:17:01
【问题描述】:
您好,我正在寻找一种在用户建立 WebSocket 连接时对用户进行身份验证的方法,如果他们未通过身份验证,则关闭连接。我正在使用 Dropwizard 框架和 Atmosphere 进行 WebSocket 连接。 Here 是我使用的示例。 如果我可以在建立连接时使用 Dropwizard 提供的“@Auth”注释进行身份验证,那就太好了。
【问题讨论】:
标签: java dropwizard atmosphere
您好,我正在寻找一种在用户建立 WebSocket 连接时对用户进行身份验证的方法,如果他们未通过身份验证,则关闭连接。我正在使用 Dropwizard 框架和 Atmosphere 进行 WebSocket 连接。 Here 是我使用的示例。 如果我可以在建立连接时使用 Dropwizard 提供的“@Auth”注释进行身份验证,那就太好了。
【问题讨论】:
标签: java dropwizard atmosphere
你是怎么曝光的?它是通过javascript前端吗?
您正在使用链接和此处所述的基于 servlet 的方法:https://cvwjensen.wordpress.com/2014/08/02/websockets-in-dropwizard/,而不是球衣氛围扩展?
如果您使用的是基于 servlet 的方法,建议您使用基于令牌的方法将令牌放在 http 标头中,然后在 @Ready 处理程序方法中访问此标头,如下所示:
@Ready
public String onReady(final AtmosphereResource resource) {
String AuthHeader = resource.getRequest().getHeader("Authorization");
...DO AUTH HERE
logger.info("Resource {} connected ", resource.uuid());
return "Connect " + resource.uuid();
}
然后,如果身份验证失败,您也可以轻松关闭连接。但是,根据您的客户端实现,您可能需要考虑这一点。如果客户端在关闭时自动重新连接,您会遇到不断关闭和打开套接字的情况,这可能会导致资源耗尽。如果身份验证不成功,您可以存储一个私有变量来说明此实例是否经过身份验证,然后放弃向其发送任何消息或处理来自它的任何消息。这也是一种让攻击者知道身份验证失败的“晦涩”方式,它只是处于不确定状态;已连接,但未失败或关闭。只是没有收到任何数据。但同样,这是特定于您的实现的。
Jwt 身份验证是一个选项,请查看:https://github.com/ToastShaman/dropwizard-auth-jwt。虽然没有公开,但我已经将此实现移植到 dropwizard 0.8rc3-SNAPSHOT。如果你需要这个,请告诉我,我可以将它发布到 github。
【讨论】: