2

我正在创建一个使用 Amazon Cognito 身份验证连接到 AWS IoT 的 android 应用程序。我能够成功地对用户进行身份验证,并且能够获得凭据。使用这些凭据更新事物影子时,总是返回 403 Forbidden Exception。我已经尝试了所有方法来解决问题,但没有找到解决方案。

我的 IAM 政策是:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:GetThingShadow",
                "iot:UpdateThingShadow",

            ],
            "Resource": [
               "arn:aws:iot:us-west-2:<my_account>:thing/mythingname"
            ]
        }
    ]
}

用于连接端点的 Android 代码:

userSession= AppHelper.getCurrSession();
credentialsProvider=new CognitoCachingCredentialsProvider(getApplicationContext(),POOL_ID,REGIONS);

    Map<String,String> logins=new HashMap<String, String>();
    logins.put("cognito-idp.us-west-2.amazonaws.com/user_pool_id",userSession.getIdToken().getJWTToken());

    credentialsProvider.setLogins(logins);
    iotDataClient=new AWSIotDataClient(credentialsProvider);

    iotDataClient.setEndpoint(ENDPOINT);

更新事物影子:

 UpdateThingShadowRequest request=new UpdateThingShadowRequest();
            request.setThingName(thingName);

            ByteBuffer payloadBuffer=ByteBuffer.wrap(updateState.getBytes());
            request.setPayload(payloadBuffer);

            UpdateThingShadowResult result=iotDataClient.updateThingShadow(request);

任何有关这方面的帮助将不胜感激。

4

2 回答 2

7

我和你有同样的问题。我找到了解决方案。

那个 403 状态码意味着你需要授权。

如果您阅读此文档(接近尾声):发布/订阅策略示例,说明您需要2 个策略才能使其与经过身份验证的 Cognito 用户一起使用。一个用于 Cognito 身份池,另一个用于 Cognito 用户。

无法使用 UI 将策略附加到认知用户,但您可以通过 CLI 执行此操作。

将策略附加到 cognito 用户的命令是:

aws iot attach-principal-policy --principal "cognito user id" --policy-Name "policy name"

您可以在以下位置找到您的cognito 用户 ID

Cognito > Manager Federated Identities > choose your identity pool > identity browser > and find your identity ID

我将此政策用于测试目的。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:*"
            ],
            "Resource": [
                "*"
            ]
        }
     ]
 }

要使其可重用,您需要使用 lambda 函数(此处为 JavaScript)。

var AWS = require('aws-sdk');
var iot = new AWS.Iot();

exports.handler = function(event, context, cb) {
    var params = {
        policyName: 'your policy',
        principal: 'your cognito id'
    };

    var out = iot.attachPrincipalPolicy(params, function(err, data) {
        if (err) cb(err);
        else cb(null, data); 
    });
};
于 2017-01-03T17:45:32.647 回答
0

我能够识别问题。就我而言,我错过了regionAWS iot客户设置的机会。

Region region = Region.getRegion(MY_REGION);
mIotAndroidClient.setRegion(region); // I was missing this piece of code 
于 2017-01-05T05:38:38.567 回答