You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过AWS Cognito用户池实现AWS IoT MQTT连接认证

使用Cognito用户池身份配置AWS IoT MQTT5客户端

要通过已关联IoT策略的Cognito用户池身份连接AWS IoT,不能直接用用户池返回的accessToken或idToken,需要先通过Cognito Identity Service(身份池)获取临时AWS凭证,再用这些凭证签署MQTT连接请求。以下是具体配置步骤:

步骤1:获取Cognito Identity ID

用已拿到的idToken调用Cognito Identity的GetId接口,关联你的用户池身份提供者,获取唯一的Identity ID:

CognitoIdentityClient cognitoIdentityClient = CognitoIdentityClient.builder()
        .region(Region.US_EAST_1) // 替换为你的AWS区域
        .build();

GetIdRequest getIdRequest = GetIdRequest.builder()
        .identityPoolId("your-identity-pool-id") // 替换为你的Cognito身份池ID
        .logins(Map.of(
            "cognito-idp.<区域>.amazonaws.com/<用户池ID>", idToken // 格式示例:cognito-idp.us-east-1.amazonaws.com/us-east-1_abc123
        ))
        .build();

GetIdResponse getIdResponse = cognitoIdentityClient.getId(getIdRequest);
String identityId = getIdResponse.identityId();

步骤2:获取临时AWS凭证

用Identity ID和用户池idToken调用GetCredentialsForIdentity接口,获取带有IoT策略权限的临时Access Key、Secret Key和Session Token:

GetCredentialsForIdentityRequest credentialsRequest = GetCredentialsForIdentityRequest.builder()
        .identityId(identityId)
        .logins(Map.of(
            "cognito-idp.<区域>.amazonaws.com/<用户池ID>", idToken
        ))
        .build();

GetCredentialsForIdentityResponse credentialsResponse = cognitoIdentityClient.getCredentialsForIdentity(credentialsRequest);
Credentials credentials = credentialsResponse.credentials();

String tempAccessKey = credentials.accessKeyId();
String tempSecretKey = credentials.secretKey();
String sessionToken = credentials.sessionToken();

步骤3:配置AwsIotMqtt5ClientBuilder

使用临时凭证配置MQTT5客户端,通过SigV4签名完成身份认证:

// 替换为你的AWS IoT端点(可通过控制台或CLI查询)
String iotEndpoint = "your-iot-endpoint-ats.iot.<区域>.amazonaws.com";

AwsIotMqtt5ClientBuilder builder = AwsIotMqtt5ClientBuilder.builder()
        .endpoint(iotEndpoint)
        .region(Region.US_EAST_1) // 替换为你的AWS区域
        .credentialsProvider(StaticCredentialsProvider.create(
            AwsBasicCredentials.create(tempAccessKey, tempSecretKey)
        ))
        .sessionToken(sessionToken)
        .clientId(identityId) // 建议用Identity ID作为客户端ID,避免冲突
        .build();

// 启动并连接客户端
Mqtt5Client client = builder.build();
client.start();
client.connect().join(); // 同步等待连接完成

关键注意事项

  • 确保你的Cognito身份池已与用户池关联:在身份池的“身份提供者”设置中添加目标用户池,并配置已认证用户的访问权限。
  • 确认some-iot-policy策略包含必要的MQTT权限,比如iot:Connect、iot:Publish、iot:Subscribe等,且资源范围匹配你的业务需求(例如允许访问特定MQTT主题)。
  • 临时凭证默认有效期1小时,需实现凭证刷新逻辑,避免连接中断。

内容的提问来源于stack exchange,提问作者underwater ranged weapon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:52:39