Angular中如何利用AWS Amplify Cognito令牌访问AWS IoT Core PubSub?
Angular中利用AWS Amplify Cognito令牌访问AWS IoT Core PubSub的实现步骤
核心逻辑说明
Cognito返回的IdToken会被Amplify自动用来通过AWS STS服务换取临时AWS凭证,无需手动处理令牌到凭证的转换——你只需要确保权限配置正确,以及Amplify PubSub插件与Auth模块联动正常。
步骤1:配置Cognito身份池的IoT权限
给Cognito身份池的Authenticated角色添加以下IAM策略,允许用户访问IoT Core的PubSub功能:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect", "iot:Subscribe", "iot:Receive" ], "Resource": [ "arn:aws:iot:us-east-1:你的AWS账号ID:client/${cognito-identity.amazonaws.com:sub}", "arn:aws:iot:us-east-1:你的AWS账号ID:topic/你的主题路径/*" ] } ] }
注意替换占位符为你的实际AWS账号ID、区域和主题路径
步骤2:修正并完善登录后的PubSub初始化代码
你的现有代码缺少PubSub的初始化和订阅逻辑,修改后如下:
async signIn() { try { const user = await Auth.signIn('xxxxx', 'xxxxx'); if (user.challengeName === 'NEW_PASSWORD_REQUIRED') { const updatedUser = await Auth.completeNewPassword( user, 'xxx', { email: 'xxxx@example.com' } ); console.log('用户完成密码重置并登录:', updatedUser); this.initPubSub(); // 完成密码后初始化PubSub } else { console.log('用户登录成功'); this.initPubSub(); // 直接初始化PubSub } } catch (e) { console.error('登录失败:', e); } } private initPubSub() { console.log('连接AWS IoT...'); // 注册IoT插件 Amplify.addPluggable(new AWSIoTProvider({ aws_pubsub_region: 'us-east-1', // 注意填写完整区域标识符 aws_pubsub_endpoint: 'wss://xxxxx-ats.iot.us-east-1.amazonaws.com/mqtt', })); // 订阅目标IoT主题并监听消息 PubSub.subscribe('你的目标IoT主题名').subscribe({ next: (data) => console.log('收到IoT消息:', data), error: (error) => console.error('PubSub错误:', error), complete: () => console.log('订阅流程结束') }); }
关键细节说明
- Amplify Auth自动维护临时凭证:登录成功后,Amplify会自动用Cognito的
IdToken向STS请求临时凭证并缓存,PubSub插件会直接使用缓存的凭证访问IoT Core,无需手动处理令牌转换。 - 区域配置需准确:
aws_pubsub_region必须是完整的区域名(如us-east-1,不能只写us-east)。 - 主题权限要匹配:IAM策略中的
Resource必须包含你要订阅的IoT主题路径,否则会触发权限拒绝错误。
内容的提问来源于stack exchange,提问作者mukund srinivas
相关产品推荐
相关产品推荐

