未授权Cognito身份凭证对Kinesis视频资源执行操作

时间:2019-07-15 21:21:38

标签: amazon-web-services amazon-cognito amazon-kinesis

我正在尝试允许使用Cognito身份池访问Kinesis视频流,但是在调用AccessDeniedException时得到GetDataEndpoint

IAM角色策略文档:

{
    "Sid": "Stream",
    "Effect": "Allow",
    "Action": [
        "kinesisvideoarchivedmedia:GetHLSStreamingSessionURL",
        "kinesisvideo:GetDataEndpoint"
        ],
    "Resource": "arn:aws:kinesisvideo:us-west-2:XXXXXXXXXXXX:stream/<stream-name>/<stream-id>"
}

我已经使用策略模拟器测试了该策略,它表明在流上允许执行GetDataEndpoint操作,但是在浏览器中对其进行测试时,会发生访问被拒绝的异常:

  

AccessDeniedException:   用户:arn:aws:sts :: XXXXXXXXXXXX:assumed-role // CognitoIdentityCredentials   无权执行:资源上的kinesisvideo:GetDataEndpoint:   <resource-name>

这是我在网站上获取临时凭据的方式:

AWS.config.region = 'us-west-2';AWS.config.credentials = new AWS.CognitoIdentityCredentials({
     IdentityPoolId: <identity-pool>,
});

AWS.config.credentials.get(function (err, data) {
    if (!err) {
        id = AWS.config.credentials.identityId;
        accessKey = AWS.config.credentials.accessKeyId;
        secretKey = AWS.config.credentials.secretAccessKey;
        token = AWS.config.credentials.sessionToken;
    }
});

我曾尝试对Kinesis视频操作和资源使用通配符,但仍然遇到相同的错误。任何建议将不胜感激。

3 个答案:

答案 0 :(得分:1)

要轻松解决此问题,您还应该将未经身份验证的角色 RoleArn 传递给 CognitoIdentityCredentials

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
     IdentityPoolId: <identity-pool>,
     RoleArn: <unauthorizedRoleArn>
});

这将确保按照here的规定

如果提供了RoleArn,则此提供程序在首先从AWS.CognitoIdentity.getOpenIdToken()获得Open ID令牌后,将使用AWS.STS.assumeRoleWithWebIdentity()服务操作获取凭据。

这实质上意味着将使用Basic (Classic) Flow

提供凭据

除此之外,您还应该在“身份池身份验证”流设置中允许“基本(经典)流”

答案 1 :(得分:0)

这是由于Cognito应用于未经身份验证的用户的范围缩小策略。在这里进一步解释: https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html

如上述文档所述:

如果您需要访问这些服务以外的其他服务 未经身份验证的用户,必须使用基本身份验证流程。

答案 2 :(得分:0)

我知道这很旧,但我为此苦苦挣扎了几个小时,即使使用 RoleArn: <unauthorizedRoleArn> 并遵循此 issue 中的建议也无法让它工作。

就我而言,我的用户已经通过 Amplify.Auth.signIn() 进行了身份验证,但我需要使用 AWS.KinesisVideo(),它未包含在放大 sdk。

最终使用了预先生成的 AWSCrendentials post signIn。可能不是最好的方法,但它确实有效。

const checkCognitoUserSession = async () => {
  const getAwsCredentials = await Auth.currentCredentials();
  const awsCredentials = await Auth.essentialCredentials(getAwsCredentials);

  return awsCredentials;
}; 

 const awsCredentials = await checkCognitoUserSession();

  AWS.config.update({
     credentials: new AWS.Credentials({
        accessKeyId: awsCredentials.accessKeyId,
        secretAccessKey: awsCredentials.secretAccessKey,
        sessionToken: awsCredentials.sessionToken,
     }),
  });

 new AWS.KinesisVideo({ apiVersion: '2017-09-30', region: config.Auth.region });
相关问题