我正在设计一个平台,其中大量支持云的嵌入式设备将使用 Amazon SNS 向移动应用程序发送推送通知。
每个嵌入式设备都应创建一个 SNS 主题并发布到该主题。用户将注册一个主题并接收这些通知。
我的问题是:嵌入式设备应如何处理与 AWS 的身份验证/授权,以便创建主题并发布通知。以下是我迄今为止考虑过的选项:
- 创建一个 IAM 用户,供所有嵌入式设备“共享”。这不是一个好主意:如果一台设备被黑客入侵,所有设备都会受到威胁。
- 为每个嵌入式设备创建不同的 IAM 用户。这可能是一个选项,但 AWS 将其限制为 5000
- 设置与 AWS 通信的中间服务器;将为该服务器创建一个 IAM 用户。然后服务器生成临时凭证嵌入式设备可根据需要使用此功能,设备可使用此功能通过 AWS 进行身份验证。我不喜欢这种方式,因为它引入了额外的依赖/单点故障(中间服务器)。
我还有什么其他选择?我确信我不是第一个遇到这个问题的人。
答案1
先决条件和设置:
- 在您的嵌入式设备上安装 Javascript SDK(由于您没有提到设备的限制,因此该架构假定您的设备足以运行 Javascript SDK)
- 在 Cognito 中创建“用户池”(通过 AWS 控制台或 API、CLI 等)
- 作为初始设备设置的一部分,使用与您的架构、目标应用受众和业务模型相符的独特属性,为每台设备注册一个新用户
身份验证流程:
- 当您想要向 SNS 推送新消息时,会发生以下事情:
- 您的应用程序(在嵌入式设备上)使用 Cognito 启动安全远程密码验证(当然是通过 SDK 方法)
- 如果身份验证请求成功,Cognito 将使用令牌进行响应
- 您的应用程序使用该令牌并调用 API 网关公开的 POST 端点,并使用
token
步骤 3 中收到的令牌进行身份验证 - 用于
token
对 Cognito 上的“用户池”进行身份验证,以验证请求是否来自真正的设备 - 如果身份验证请求成功,API 网关将调用一个附加了适当 IAM 角色的 Lambda 函数,此 IAM 角色实际上允许它将消息发布到 SNS 主题
- Lambda 函数将消息发布到所需的 SNS 主题。由于您提到每个设备都将发布到自己的 SNS 主题,因此有关 SNS 主题的信息可以存储在 Cognito 中的用户元数据字段中