[我正在尝试允许使用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视频操作和资源使用通配符,但仍然会遇到相同的错误。任何建议,将不胜感激。
这将归因于Cognito应用于未经身份验证的用户的范围缩小策略。在这里进一步说明:https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html
如上述文档所述:
如果您需要访问这些服务以外的其他服务, 未经身份验证的用户,必须使用基本身份验证流程。
为了轻松解决此问题,您还应该将未经身份验证的角色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提供凭据。>
此外,您还应该在身份池身份验证流设置中允许基本(经典)流