为未经身份验证的用户使用 phoenix 通道而不是 ajax 是多么安全和惯用

How safe and idiomatic would be to use phoenix channels for unauthenticated users instead of ajax

一点上下文和用例:我有这个 phoenix 应用程序,它允许经过身份验证的用户在数据库中搜索,以检索 public 数据。未经身份验证的用户使用 ajax 调用和路由来触发控制器并发回 json 响应以获得相同的结果。

是否可以以某种方式将未经身份验证的用户连接到私人频道(可能是客人或其他人)以便我可以放弃 ajax 呼叫?你是如何在你的应用中解决这个问题的?

我这样创建套接字连接:

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

如果可以,需要注意什么?

谢谢

您没有理由不能这样做。

如果您需要 return 不同的数据,具体取决于用户是否经过身份验证,我可能会执行以下操作之一

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

"authenticated:room:4" 和 "unauthenticated:room: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

但是,如果经过身份验证和未经过身份验证的请求之间没有数据差异,则不会产生额外的开销。只做用户要求的事情。