对于未经身份验证的用户而不是ajax,使用凤凰频道是多么安全和惯用

时间:2018-02-12 19:23:47

标签: ajax elixir phoenix-framework phoenix-channels

一个小环境和用例:我有这个凤凰应用程序,允许经过身份验证的用户在数据库中搜索,以检索公共数据。未经身份验证的用户使用ajax调用和路由来触发控制器并发回json响应以获得相同的结果。

是否可以将某些未经身份验证的用户连接到私人频道,也可以作为访客或其他东西,以便我可以放弃ajax呼叫?你是如何在你的应用程序中解决这个问题的?

我创建了这样的套接字连接:

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

如果有可能,我应该注意什么?

由于

1 个答案:

答案 0 :(得分:0)

没有理由不能这样做。

如果您需要返回不同的数据,具体取决于用户是否经过身份验证,我可能会做一个

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

"验证:室温:4"和"未经认证:房间: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

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