为未经身份验证的用户使用 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
但是,如果经过身份验证和未经过身份验证的请求之间没有数据差异,则不会产生额外的开销。只做用户要求的事情。
一点上下文和用例:我有这个 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
但是,如果经过身份验证和未经过身份验证的请求之间没有数据差异,则不会产生额外的开销。只做用户要求的事情。