Java AWS MQTT Websocket,身份验证访问受到限制

Java AWS MQTT Websocket,身份验证访问受到限制,java,amazon-web-services,authentication,websocket,mqtt,Java,Amazon Web Services,Authentication,Websocket,Mqtt,我目前正在Android Studio中进行一个AWS移动应用程序项目,我目前正在尝试通过AWS Cognito和IAM身份验证建立到AWS IoT的MQTT连接 如果我将MQTT客户机作为一个独立的项目运行,而不进行身份验证,假设使用未经身份验证的IAM角色,那么我就能够连接到MQTT,并从给定主题订阅和接收 但是,一旦我尝试通过经过身份验证的用户(通过登录我的移动应用程序)运行MQTT客户机,客户机就会受到限制,并不断尝试重新连接 我启用了AWS CloudWatch的登录,并给出了以下调试

我目前正在Android Studio中进行一个AWS移动应用程序项目,我目前正在尝试通过AWS Cognito和IAM身份验证建立到AWS IoT的MQTT连接

如果我将MQTT客户机作为一个独立的项目运行,而不进行身份验证,假设使用未经身份验证的IAM角色,那么我就能够连接到MQTT,并从给定主题订阅和接收

但是,一旦我尝试通过经过身份验证的用户(通过登录我的移动应用程序)运行MQTT客户机,客户机就会受到限制,并不断尝试重新连接

我启用了AWS CloudWatch的登录,并给出了以下调试消息: “…事件:MQTT客户端连接消息:连接状态:授权\错误”

IAM控制台中的unauth和auth角色具有相同的策略和资源访问权限,但是有什么东西正在停止MQTT连接

另外,在我的应用程序中,Auth角色可以访问用户文件&S3,probelem对于物联网访问似乎是唯一的

是否有人知道是否可以允许通过授权用户连接而不使用证书文件,如果可以,如何实现?除非我弄错了,否则Cognito和IAM应该能够执行访问资源所需的授权(而且它能够,只要我没有登录到auth角色)


感谢在这一点上我能得到的任何提示,我已经挣扎了一段时间。

通过更彻底地阅读AWS文档,我最终解决了这个问题

AWS凭据提供程序未存储授权通过AWS访问所需的信息。因此,我通过将所需的用户令牌检索到散列中,并将其设置为凭据提供程序,解决了这个问题,最终解决了这个问题

AuthenticationResultType authenticationResultType = new AuthenticationResultType();
    String idToken = authenticationResultType.getIdToken();


    // Initialize the AWS Cognito credentials provider
    credentialsProvider = new CognitoCachingCredentialsProvider(
            getApplicationContext(),
            COGNITO_POOL_ID,
            MY_REGION
    );

    Map<String, String> logins = new HashMap<String, String>();
    logins.put("yourAWSEndpoint", idToken);
    credentialsProvider.setLogins(logins);
AuthenticationResultType AuthenticationResultType=新建AuthenticationResultType();
字符串idToken=authenticationResultType.getIdToken();
//初始化AWS Cognito凭据提供程序
credentialsProvider=新CognitoCachingCredentialsProvider(
getApplicationContext(),
COGNITO_POOL_ID,
我的家乡
);
Map logins=new HashMap();
logins.put(“yourAWSEndpoint”,idToken);
credentialsProvider.setLogins(登录名);

通过更彻底地阅读AWS文档,我最终解决了这个问题

AWS凭据提供程序未存储授权通过AWS访问所需的信息。因此,我通过将所需的用户令牌检索到散列中,并将其设置为凭据提供程序,解决了这个问题,最终解决了这个问题

AuthenticationResultType authenticationResultType = new AuthenticationResultType();
    String idToken = authenticationResultType.getIdToken();


    // Initialize the AWS Cognito credentials provider
    credentialsProvider = new CognitoCachingCredentialsProvider(
            getApplicationContext(),
            COGNITO_POOL_ID,
            MY_REGION
    );

    Map<String, String> logins = new HashMap<String, String>();
    logins.put("yourAWSEndpoint", idToken);
    credentialsProvider.setLogins(logins);
AuthenticationResultType AuthenticationResultType=新建AuthenticationResultType();
字符串idToken=authenticationResultType.getIdToken();
//初始化AWS Cognito凭据提供程序
credentialsProvider=新CognitoCachingCredentialsProvider(
getApplicationContext(),
COGNITO_POOL_ID,
我的家乡
);
Map logins=new HashMap();
logins.put(“yourAWSEndpoint”,idToken);
credentialsProvider.setLogins(登录名);

您能更具体地说明您是如何解决这个问题的吗?您能更具体地说明您是如何解决这个问题的吗?