我想将API网关端点与Socket.io服务器端点进行映射,以便通过Cognito对用户进行身份验证,如果成功,则重定向到Socket.io服务器并建立具有可选名称空间和房间的套接字。
这有意义吗?我没有找到任何示例,并且API Gateway最近才启用了WebSocket API,但不支持Socket.io
答案 0 :(得分:3)
您的问题分为两个部分:
首先,API网关使用Cognito对您的客户端进行身份验证;
第二,假设您使用的EC2运行带有API。网关作为客户端端点的带有Socket.IO的Node.JS。
对于第一部分,您可以使用以下reference from AWS documentation。
在谈论AWS Cognito时,有几个子部分,例如,包括用于启用API资源端点HTTP方法的AIM权限Method Execution
。
第二点,enable API Gateway与运行Socket.io的EC2端口建立同步连接,您可能会读到一些参考文献,例如this one。 您应该配置API网关:
WebSocket
连接\$default
$connect
,$disconnect
和$default
映射目标后端
答案 1 :(得分:1)
Rafael 的回答更侧重于使用 Websocket API 网关,在我看来它仍然相对较新,并且有一些改进空间。另外,我不喜欢将 lambda 与数据库访问集成,因为没有 RDS 代理,它们会非常快地超过数据库连接,而且我认为 HTTP 集成不会为整个事情增加任何东西,因为您最终执行的是 HTTP 请求,但它是通过 Websocket API 调用。
我同意 Rafael 的一件事是,您需要有一个运行 socket.io 的 EC2 实例,无论它是在 Node.js 中还是在 python 中(在我的情况下,我使用 python 和 Flask)。
我通过使用 HTTP API 网关并设置 allow_upgrades=False
设法连接到我的 socket.io,因此 http 协议不会升级到 ws 协议,因为 HTTP API 网关不支持 ws。我的 HTTP API 网关只是将 socket.io 请求转发到负载均衡器,好处是您可以在 HTTP API 网关中定义的每个路由上定义 access control。
我的 EC2 实例上的 socket.io 定义如下:
socketio = SocketIO(async_handlers=True, allow_upgrades=False, cors_allowed_origins='*')
我的客户端只需调用启用了代理集成的 HTTP API 网关中定义的路由即可连接到它。
https://xxxxxxxxx.execute-api.us-west-2.amazonaws.com/socket.io/{proxy}
最终结果 - 客户端连接到套接字