获取 403 尝试调用 Google Cloud Endpoints API 托管在 App Engine Java 8,开发应用程序服务器

Getting 403 trying to call Google Cloud Endpoints API hosted on App Engine Java 8, dev app server

运行 具有 Google 云端点的 App Engine Java 8 应用程序。我已经生成 openapi.json,将其部署到我的端点门户,并且可以在我的门户中看到 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.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 模拟器连接到我的本地开发应用程序服务器并进行端点调用。每次启动开发应用程序服务器时,我都厌倦了在浏览器中看到 403,并且担心当我最终推出这项新服务时,它可能预示着生产中会出现类似的问题。

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

  • 确保您的服务可以通过 运行 云 Shell 上的以下命令启用 servicecontrol.googleapis.com:

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

    <env-var name="ENDPOINTS_SERVICE_NAME" value="$PROJECT"/>
    
  • 检查 OpenAPI 规范是否部署到云端,您可以通过 运行 Cloud Shell:

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