调用 API 时 (401) 出现未经授权的错误

参阅有关 Azure API 管理疑难解答系列的文章,这是实验室的第三种方案。 请确保已按照 步骤按照实验室设置说明重新创建问题。

原始产品版本:API 管理服务
原始 KB 编号: 4464930

症状

Echo API 突然开始引发各种类型的 HTTP 401 - 在调用其下的操作时出现未经授权的错误。 创建资源检索资源 操作将显示此错误消息:

{
“statusCode”: 401,
“message”:“由于订阅密钥无效,访问被拒绝。 请确保为活动订阅提供有效的密钥。”
}

其余操作显示

{
“statusCode”: 401,
“message”:“由于缺少订阅密钥,访问被拒绝。 向 API 发出请求时,请务必包含订阅密钥。
}

所有操作的预期 HTTP 响应代码为 200,但响应正文会有所不同,因为后端 API 始终回显作为请求正文发送的任何内容,以及标头。

故障排除步骤

  • 若要获取对 API 的访问权限,开发人员必须先订阅产品。 当他们订阅时,他们会收到一个订阅密钥,该密钥作为请求标头的一部分发送,对该产品中的任何 API 都有好处。 Ocp-Apim-Subscription-Key 是为与此 API 关联的产品的订阅密钥发送的请求标头。 密钥会自动填充。

  • 关于由于订阅密钥无效而拒绝访问的错误。请确保为活动订阅提供有效的密钥,很明显,在调用“创建资源”和“检索资源操作”时,你发送了错误的 Ocp-Apim-Subscription-Key 请求标头值。

  • 可以通过登录后导航到 “配置文件 ”页,从 APIM 开发人员门户检查特定产品的订阅密钥,如下所示。

  • 选择 “显示 ”按钮可查看已订阅的相应产品的订阅密钥。

    相应产品的订阅密钥的屏幕截图。

  • 如果检查从 “测试 ”选项卡发送的标头,则会发现 Ocp-Apim-Subscription-Key 请求标头的值错误。 你可能想知道这怎么可能,因为 APIM 会自动使用正确的订阅密钥填充此请求标头。

  • 让我们在“设计”选项卡下查看“创建资源”和“检索资源操作”的前端定义。仔细检查后,你会注意到这些操作在“标头”选项卡下添加了错误的 Ocp-Apim-Subscription-Key 请求标头的硬编码值。

  • 可以将其删除,这应该可以解决无效的订阅密钥问题,但仍会出现缺少订阅密钥错误。

    可能会收到以下错误消息:

    HTTP/1.1 401 未经授权

    内容长度:152
    Content-Type:application/json
    日期:周日,2018年7月29日 14:29:50 GMT
    Vary: Origin WWW-Authenticate: AzureApiManagementKey realm=“https://pratyay.azure-api.net/echo”,name=“Ocp-Apim-Subscription-Key”,type=“header” {
    “statusCode”: 401,
    “message”:“由于缺少订阅密钥,访问被拒绝。 向 API 发出请求时,请务必包含订阅密钥。

  • 转到 Echo APITtings 并检查它是否与任何可用产品相关联。 如果没有,则必须将此 API 与产品关联,以便获得订阅密钥。

    开发人员必须先订阅产品才能访问 API。 当他们订阅时,他们会获得一个适合该产品中任何 API 的订阅密钥。 如果创建了 APIM 实例,则已是管理员,因此默认情况下会订阅每个产品。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持