【问题标题】:Aws mqtt connection using cognito credential provider in android在 android 中使用 cognito 凭证提供程序的 Aws mqtt 连接
【发布时间】:2020-09-01 03:10:28
【问题描述】:

我正在尝试使用 cognito 凭据提供程序将我的应用程序与 mqtt 代理连接。当我尝试连接到 mqtt broker..app 时说未找到身份 poolId。

  CognitoUserSession cognitoUserSession = AppHelper.getCurrSession();

                String idToken = cognitoUserSession.getIdToken().getJWTToken();

                Map<String,String> logins = new HashMap<String, String>();
                logins.put("cognito-idp.ap-south-1.amazonaws.com/XXXX_XXXX", idToken);

                CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                        getApplicationContext(),
                        "ap-south-1:XXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX", // Identity pool ID
                        Regions.AP_SOUTH_1 // Region
                );
                credentialsProvider.setLogins(logins);

                AmazonCognitoIdentity cognitoIdentity = new AmazonCognitoIdentityClient(credentialsProvider);
                GetIdRequest getIdReq = new GetIdRequest();
                getIdReq.setLogins(logins); //or if you have already set provider logins just use credentialsProvider.getLogins()
                getIdReq.setIdentityPoolId(credentialsProvider.getIdentityPoolId());
                GetIdResult getIdRes = cognitoIdentity.getId(getIdReq);

                AttachPrincipalPolicyRequest attachPolicyReq = new AttachPrincipalPolicyRequest(); //in docs it called AttachPolicyRequest but it`s wrong
                attachPolicyReq.setPolicyName(AWS_IOT_POLICY_NAME); //name of your IOTAWS policy
                attachPolicyReq.setPrincipal(getIdRes.getIdentityId());
                new AWSIotClient(credentialsProvider).attachPrincipalPolicy(attachPolicyReq);

                mqttManager.connect(credentialsProvider, new AWSIotMqttClientStatusCallback() {
                    @Override
                    public void onStatusChanged(final AWSIotMqttClientStatus status, Throwable throwable) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {

                                txtStatus.setText(status.toString());
                            }
                        });


                    }
                });

            }catch(final AmazonClientException e){
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),"exception : "+e,Toast.LENGTH_LONG).show();
                    }
                });

                Log.d(LOG_TAG,"Exception : "+e);

            }

日志文件:

 com.amazonaws.services.cognitoidentity.model.ResourceNotFoundException: IdentityPool 'ap-south-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX' not found. (Service: AmazonCognitoIdentity; Status Code: 400; Error Code: ResourceNotFoundException; Request ID: bdd3c355-79b0-48f3-8a18-716fa17c44ce)

谁能指导我如何解决这个问题。我的代码出了什么问题。

谢谢 前进。

【问题讨论】:

    标签: android mqtt


    【解决方案1】:

    如您的日志所示,您没有在 Android 应用中设置 Cognito 身份池 IDRegion(您的身份池所在的位置)。您可以在 AWS 联合身份控制面板中您的身份池的示例代码下找到它们。

    【讨论】:

    • 感谢您的快速回复。我已经在我的应用程序中设置了我想要的认知身份池和区域。你可以看到 CognitoCachingCredentialsProvider 方法。
    • 您发布的日志显示了一些错误。您是否还为 logins 正确设置了您的 user pool id(即您是否从用户池中获取 idToken)?我建议检查this
    • 感谢@Keivan,我可以从用户池中获取 idToken。我正在关注以下链接。 stackoverflow.com/questions/44244375/…
    猜你喜欢
    • 2019-09-15
    • 2019-11-29
    • 2016-10-02
    • 1970-01-01
    • 2020-09-30
    • 2021-01-09
    • 2021-07-18
    • 2015-02-06
    • 1970-01-01
    相关资源
    最近更新 更多