将凤凰通道用于未经身份验证的用户而不是Ajax是多么安全和惯用



一个少量上下文和用例:我有这个phoenix应用程序,允许身份验证的用户可以在数据库中搜索以检索公共数据。未经验证的用户使用AJAX呼叫和路由来触发控制器并将JSON响应发送回具有相同的结果。

可以以某种方式将未经验证的用户连接到私人频道,也许是作为客人或其他东西,以便我可以抛弃Ajax?您如何在应用程序中解决此问题?

我这样创建套接字连接:

socket = new Socket('/socket', {params: {guardian_token: app.guardian_token}})

如果可能的话,我应该小心?

谢谢

没有真正的原因你不能这样做。

如果您需要根据用户的身份验证是否返回不同的数据,我可能会做

之一

为身份验证和未经身份验证的请求创建不同的频道名称。

"身份验证:房间:4"one_answers"未经身份验证:房间:4"。您可能还需要创建一个MyApp.Authenticated.RoomChannel模块和MyApp.Unauthenticated.RoomChannel。不过,如果您有很多频道,这可能会有些失控。

handle_in/3功能中创建不同的分支。

在您的联接功能中,在套接字上放一个标记,说明用户是否已验证。然后,在您的handle_in/3功能中,您可以做

之类的事情
def handle_in(msg, params, socket) do
  if socket.assigns.authenticated do
    authenticated_request(msg, params, socket)
  else
    unauthenticated_request(msg, params, socket)
  end
end

但是,如果身份验证和未经身份验证的请求之间没有数据差,则没有其他开销。只是用户问的事情。

最新更新