首页 > 解决方案 > 获取 403 尝试调用托管在 App Engine Java 8、开发应用服务器上的 Google Cloud Endpoints API

问题描述

使用 Google Cloud Endpoints 运行 App Engine Java 8 应用程序。我已生成 openapi.json,将其部署到我的 Endpoints 门户,并且可以在我的门户中看到 API,并正确列出了各种方法和资源。

我正在使用 Cloud Code 插件在 IntelliJ 本地运行开发应用程序服务器。当我运行它时,它会打开一个浏览器选项卡,显示错误 403,并带有以下堆栈跟踪(缩写):

SEVERE: direct send of a check request service_name: "my-project-redacted.appspot.com"
operation {
  operation_id: "11b8f9a6-c9cb-4895-95fb-8bb39176efb9"
  operation_name: "1.my_project_dot_appspot_com.MyAPI"
  consumer_id: "project:my-project"
  start_time {
    seconds: 1596075164
    nanos: 812000000
  }
  end_time {
    seconds: 1596075164
    nanos: 812000000
  }
  labels {
    key: "servicecontrol.googleapis.com/caller_ip"
    value: "127.0.0.1"
  }
  labels {
    key: "servicecontrol.googleapis.com/user_agent"
    value: "ESP"
  }
  labels {
    key: "servicecontrol.googleapis.com/service_agent"
    value: "EF_JAVA/1.0.12"
  }
}
 failed
endpoints.repackaged.com.google.api.client.http.HttpResponseException: 403
{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "errors": [
      {
        "message": "The caller does not have permission",
        "domain": "global",
        "reason": "forbidden"
      }
    ],
    "status": "PERMISSION_DENIED"
  }
}

    at endpoints.repackaged.com.google.api.client.googleapis.services.AbstractGoogleClientRequest.newExceptionOnError(AbstractGoogleClientRequest.java:456)
    at endpoints.repackaged.com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
    at endpoints.repackaged.com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)
    at endpoints.repackaged.com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
    at endpoints.repackaged.com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
    at endpoints.repackaged.com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
    at com.google.api.control.Client.check(Client.java:205)

值得注意的是,API 似乎可以工作——我让 iOS 模拟器连接到我的本地开发应用服务器并进行 Endpoints 调用。我只是厌倦了每次启动开发应用服务器时在浏览器中看到 403,并且担心当我最终推送这项新服务时,它可能预示着生产中的一些类似问题。

标签: google-app-enginegoogle-cloud-endpoints-v2

解决方案


此错误表明权限有问题或您的项目中禁用了服务控制 API,因此为了修复它,您可以:

  • 通过在 Cloud Shell 上运行以下命令,确保您的服务有权访问 servicecontrol.googleapis.com:

    gcloud services enable servicecontrol.googleapis.com
    
  • 仔细检查文件中的 ENDPOINTS_SERVICE_NAME 参数appengine-web.xml,它应该如下所示:

    <env-var name="ENDPOINTS_SERVICE_NAME" value="$PROJECT"/>
    
  • 检查 OpenAPI 规范是否已部署到 Cloud,您可以通过在 Cloud Shell 上运行以下命令进行检查:

    gcloud endpoints configs list --service=$PROJECT
    
  • 仔细检查运行您的实例的服务账户是否具有正确的 IAM 角色。


推荐阅读