我正在尝试允许使用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视频操作和资源使用通配符,但仍然遇到相同的错误。任何建议将不胜感激。
答案 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 });