【问题标题】:Cognito Identity Credentials are not authorized to perform action on Kinesis video resourceCognito 身份凭证无权对 Kinesis 视频资源执行操作
【发布时间】:2019-11-24 14:32:24
【问题描述】:

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

IAM 角色政策文档:

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

我已经使用策略模拟器测试了策略,它显示GetDataEndpoint 操作在流上是允许的,但是在浏览器中测试它时出现拒绝访问异常:

访问拒绝异常: 用户:arn:aws:sts::XXXXXXXXXXXX:assumed-role//CognitoIdentityCredentials 无权执行:kinesisvideo:GetDataEndpoint 资源: &lt;resource-name&gt;

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

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 视频操作和资源使用通配符,但仍然遇到相同的错误。任何建议将不胜感激。

【问题讨论】:

  • 您好,您找到可以分享的解决方案了吗?在这里面临同样的问题..

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


【解决方案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 提供凭据

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

【讨论】:

  • 你又为我节省了几个小时。谢谢
【解决方案2】:

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

如上述文档所述:

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

【讨论】:

    【解决方案3】:

    我知道这已经过时了,但我为此苦苦挣扎了好几个小时,即使使用 RoleArn: &lt;unauthorizedRoleArn&gt; 并遵循此 issue 中的建议,也无法使其正常工作。

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

    最终使用了预先生成的 AWSCrendentials 帖子登录。可能不是最好的方法,但确实可以。

    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 });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2020-04-12
      相关资源
      最近更新 更多