You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从AWS Cognito获取可用于Amazon Transcribe服务的临时凭证?附实操步骤与资源指引

回答:使用Amazon Cognito临时凭证调用Amazon Transcribe

嘿,很高兴帮你理清这个问题!先直接给你答案:完全可以从Amazon Cognito获取能调用Amazon Transcribe的临时凭证,你的判断完全正确~接下来我给你一步步拆解实现流程,都是AWS官方推荐的标准做法:

一、核心原理说明

Cognito身份池(Identity Pools)的核心作用就是为未认证或已认证的用户生成AWS临时凭证,这些凭证由IAM角色授权,只能执行角色允许的操作,且有有效期(默认1小时),完美解决前端不能暴露长期凭证的问题。

二、详细实现步骤

1. 创建并配置Amazon Cognito身份池

  • 登录AWS控制台,进入Cognito服务,选择「身份池」,点击「创建身份池」
  • 给身份池命名,然后根据你的业务需求选择启用未认证身份(如果前端用户无需登录即可使用)或认证身份(需要用户通过第三方登录如Google、Facebook或Cognito用户池登录)
  • 完成创建后,Cognito会自动为你生成两个IAM角色:一个用于未认证用户,一个用于认证用户(如果启用了认证身份),记住这两个角色的ARN,后续要配置权限

2. 配置IAM角色的Transcribe权限

  • 进入IAM控制台,找到Cognito生成的对应角色(比如Cognito_YourIdentityPoolAuth_Role或Cognito_YourIdentityPoolUnauth_Role)
  • 点击「添加权限」→「创建内联策略」,选择「JSON」模式,粘贴以下策略(根据你的需求调整权限范围):
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "transcribe:StartTranscriptionJob",
                "transcribe:GetTranscriptionJob",
                "transcribe:ListTranscriptionJobs"
                // 如果需要实时转写,加上 "transcribe:StartStreamTranscription"
            ],
            "Resource": "*"
        },
        // 如果你的音频文件存储在S3,需要添加S3访问权限(按需调整)
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::your-audio-bucket/*"
        }
    ]
}
  • 保存策略,确保角色拥有调用Transcribe所需的最小权限(遵循最小权限原则)

3. 后端实现获取临时凭证的端点

你的后端需要作为中间层,调用Cognito的API获取临时凭证后返回给前端。以下是Node.js + Express的示例代码:

const express = require('express');
const { CognitoIdentityClient, GetIdCommand, GetCredentialsForIdentityCommand } = require('@aws-sdk/client-cognito-identity');

const app = express();
const client = new CognitoIdentityClient({ region: 'your-aws-region' });

app.get('/get-temp-credentials', async (req, res) => {
    try {
        // 1. 获取身份ID(未认证用户使用此方式,认证用户需要传入Logins参数)
        const getIdParams = {
            IdentityPoolId: 'your-cognito-identity-pool-id'
            // 如果是认证用户,添加:
            // Logins: {
            //     'cognito-idp.your-region.amazonaws.com/your-user-pool-id': 'user-id-token'
            // }
        };
        const getIdResponse = await client.send(new GetIdCommand(getIdParams));

        // 2. 获取临时凭证
        const getCredsParams = {
            IdentityId: getIdResponse.IdentityId
        };
        const credsResponse = await client.send(new GetCredentialsForIdentityCommand(getCredsParams));

        // 返回临时凭证给前端
        res.json({
            accessKeyId: credsResponse.Credentials.AccessKeyId,
            secretAccessKey: credsResponse.Credentials.SecretKey,
            sessionToken: credsResponse.Credentials.SessionToken,
            expiration: credsResponse.Credentials.Expiration
        });
    } catch (error) {
        console.error('Error getting credentials:', error);
        res.status(500).json({ error: 'Failed to get temporary credentials' });
    }
});

app.listen(3000, () => console.log('Backend server running on port 3000'));
  • 注意替换代码中的your-aws-region、your-cognito-identity-pool-id等占位符
  • 认证用户的场景下,前端需要先获取用户池的ID Token,传递给后端,后端再传入Logins参数

4. 前端使用临时凭证调用Transcribe

前端通过调用后端的/get-temp-credentials端点获取临时凭证后,配置AWS SDK并调用Transcribe API:

import { TranscribeClient, StartTranscriptionJobCommand } from "@aws-sdk/client-transcribe";

// 从后端获取临时凭证
async function getTempCredentials() {
    const response = await fetch('/get-temp-credentials');
    return await response.json();
}

// 调用Transcribe服务
async function startTranscription() {
    const credentials = await getTempCredentials();
    
    const transcribeClient = new TranscribeClient({
        region: 'your-aws-region',
        credentials: {
            accessKeyId: credentials.accessKeyId,
            secretAccessKey: credentials.secretAccessKey,
            sessionToken: credentials.sessionToken
        }
    });

    const params = {
        TranscriptionJobName: `transcription-job-${Date.now()}`,
        LanguageCode: 'en-US', // 根据你的音频语言调整
        Media: {
            MediaFileUri: 's3://your-audio-bucket/your-audio-file.mp3'
        },
        OutputBucketName: 'your-output-bucket' // 转录结果存储的S3桶
    };

    try {
        const data = await transcribeClient.send(new StartTranscriptionJobCommand(params));
        console.log('Transcription job started:', data.TranscriptionJob);
    } catch (error) {
        console.error('Error starting transcription:', error);
    }
}

三、关键注意事项

  • 最小权限原则:IAM角色的权限只给Transcribe和必要的S3操作,不要给*权限
  • 凭证有效期:临时凭证默认有效期1小时,到期后前端需要重新调用后端端点获取新凭证
  • 后端安全:限制后端端点的访问来源(比如设置CORS只允许你的S3域名访问),防止恶意请求
  • 实时转写:如果需要实时语音转写,前端可以使用StartStreamTranscriptionAPI,流程类似,只是参数不同

内容的提问来源于stack exchange,提问作者Yash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:23:10