如何从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
相关产品推荐
相关产品推荐

