使用 Atmosphere + Dropwizard 进行身份验证

Authenticate with Atmosphere + Dropwizard

您好,我正在寻找一种在用户建立 WebSocket 连接时对用户进行身份验证的方法,如果他们未通过身份验证则关闭连接。我正在为 WebSocket 连接使用 Dropwizard 框架和 Atmosphere。 Here 是我使用的示例。 如果我可以在建立连接时使用 Dropwizard 提供的“@Auth”注释进行身份验证,那就太好了。

你是怎么曝光的?是通过 javascript 前端吗?

您正在使用 link 和此处所述的基于 servlet 的方法:https://cvwjensen.wordpress.com/2014/08/02/websockets-in-dropwizard/,而不是球衣氛围扩展?

如果您使用基于 servlet 的方法,建议使用 token-based 方法将令牌放入 http header,然后在 @Ready 处理程序方法中访问此 header,像这样:

@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();
}

然后,如果验证失败,您也可以轻松关闭连接。但是,根据您的客户端实现,您可能需要考虑这一点。如果客户端 auto-reconnects 关闭,您会遇到不断关闭和打开套接字的情况,这可能会导致资源耗尽。如果 auth 不成功,您可以存储一个私有变量,该变量说明此实例是否经过身份验证,并且只是停止向它发送任何消息或处理来自它的任何消息。这也是让攻击者知道身份验证失败的 "obscure" 方式,它只是处于不确定状态;已连接,但未失败或关闭。只是没有收到任何数据。但同样,这取决于您的实施。

Jwt auth 是一个选项,检查一下:https://github.com/ToastShaman/dropwizard-auth-jwt。我已经将此实现移植到 dropwizard 0.8rc3-SNAPSHOT,尽管没有做到 public。如果您需要这个,请告诉我,我可以 post 到 github。