调用 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 APIsettings 并检查(如果它与任何可用产品相关联)。 如果没有,则必须将此 API 与产品关联,以便获取订阅密钥。

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

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。