【问题标题】:AWS Transcribe Error: Unable to determine service/operation name to be authorizedAWS 转录错误:无法确定要授权的服务/操作名称
【发布时间】:2020-04-14 08:31:16
【问题描述】:

在长时间使用 AWS 转录后,我现在在使用 Postman 时遇到了一个新错误:

<AccessDeniedException>
  <Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>

但是,我不知道问题是什么。我试图用谷歌搜索它,但错误似乎也发生在 AWS Lambda 中。但我正在使用 AWS Transcription。任何人都可以检查似乎是什么问题?

我的示例 GET 请求是:

https://transcribestreaming.us-east-1.amazonaws.com/medical-stream-transcription-websocket?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=MYACCESSKEYID%2F20200404%2Fus-east-1%2Ftranscribe%2Faws4_request&X-Amz-Date=20200404T171802Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&language-code=en-US&media-encoding=pcm&sample-rate=16000&specialty=PRIMARYCARE&type=DICTATION&X-Amz-Signature=5f5f0a5d336e524b335245b6e83945d3057ec3905a9ae2d2ca709b77cce5478f

出于安全考虑,我有意将X-Amz-Credential 替换为 MYACCESSKEYID。

【问题讨论】:

    标签: amazon-web-services aws-transcribe


    【解决方案1】:

    可能有两个错误:

    1) “https://”请求连接到默认端口 443。这会导致“无法确定要授权的服务/操作名称”的错误。请明确使用端口:8443。

    2) 您的客户端没有正确处理 websocket 升级。在打开连接的第一个请求中,您的客户端需要通过包含多个标头来启动 websocket 升级,如https://docs.aws.amazon.com/transcribe/latest/dg/websocket-med.html#websocket-response-med的“包含 WebSocket 请求标头”部分中所述

    curl 中的示例:

    curl --include --no-buffer \
    --header "Connection: Upgrade" \
    --header "Upgrade: websocket" \
    --header "Host: transcribestreaming.us-east-1.amazonaws.com:8443" \
    --header "Origin: http://localhost:3000" \
    --header "Sec-WebSocket-Key: tEfHvBSx8jqQyZgCNrhI3w" \
    --header "Sec-WebSocket-Version: 13" \
    "https://transcribestreaming.us-east-1.amazonaws.com:8443/medical-stream-transcription-websocket?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=MYCREDENTIAL&X-Amz-Date=20200406T211542Z&X-Amz-Expires=60&X-Amz-Signature=MYSIGNATURE&X-Amz-SignedHeaders=host&language-code=en-US&media-encoding=pcm&sample-rate=16000&specialty=PRIMARYCARE&type=DICTATION"
    

    请求成功后,客户端会收到“101 Switching Protocols”。连接建立,然后您可以继续发送音频帧,如https://docs.aws.amazon.com/transcribe/latest/dg/websocket-med.html#websocket-streaming-request-med中所述

    【讨论】:

    • Mmm.. 结果是 >HTTP 错误 400。请求主机名无效。只是一个问题,你已经在这里检查过我的代码了吗? dotnetfiddle.net/SFRAil我只是想确保我的代码是正确的。
    • 这就是我现在看到的。 curl:(6)无法解析主机“升级”
    • 在命令行上运行之前,您可以尝试双引号标头和 url,因为空格在 shell 中被视为参数分隔符。我已经相应地更新了 curl 命令。
    • 您的代码示例 dotnetfiddle.net/SFRAil 包含生成预签名 url 的逻辑,看起来是正确的。如果预签名的 url 有问题,您将收到身份验证错误。但是您在这里报告的错误都与网络有关。该请求尚未到达身份验证层。要快速验证预签名 URL,您可以使用您的代码生成预签名 URL,并将其替换为我的 curl 命令的最后一行。服务器将响应 101。
    • 我看不到 101 服务器响应,但“流式传输已成功完成。”这是我应该期待的响应消息吗?抱歉,我真的很陌生。
    【解决方案2】:

    您似乎正在尝试连接到 Amazon Transcribe Medical 的 websocket 端点。查看您的 GET 请求后,您似乎缺少端口号 8443,因此您的请求未路由到 websocket 端点。

    https://docs.aws.amazon.com/transcribe/latest/dg/websocket-med.html#websocket-streaming-request-med 描述了一个创建双向请求以转录医疗流端点的示例。

    【讨论】:

    • 我尝试添加端口 :8443 但仍然无济于事。握手是错误的,所以我删除了它。检查什么是 403 Forbidden 错误,这是身份验证或无权限错误,所以我尝试将用户设置为管理员等......但仍然是上面的相同错误。
    • 您是否在使用 transcribe 之前向您的 IAM 角色添加了针对 Web 套接字请求的策略。 docs.aws.amazon.com/transcribe/latest/dg/… 提供了在进行 Web 套接字调用之前需要设置的策略示例。
    • 这个? {“版本”:“2012-10-17”,“声明”:[{“Sid”:“转录医学流”,“效果”:“允许”,“操作”:“转录:StartMedicalStreamTranscription”,“资源”:“ *" } ] } 是的,我做到了。
    • 你能分享你的代码吗?
    • 好的,这是我的完整课程。希望你能帮助我。 dotnetfiddle.net/SFRAil
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2021-10-22
    • 2020-12-04
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多