google-app-engine - 获取 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,并且担心当我最终推送这项新服务时,它可能预示着生产中的一些类似问题。
解决方案
此错误表明权限有问题或您的项目中禁用了服务控制 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 角色。
推荐阅读
- django - 如何告诉 Django 我已经覆盖了第三方应用程序
- highcharts - 如何在高图甘特图的工具提示中显示依赖项的数据?
- sql - 我想在下面存储的 PROC 中参数化 TABLE_TO_BE_DELETED 表
- macos - 在 Unity 中,如何解决错误“plugin.bundle 已损坏,无法打开。您应该将其移至 Bin”?
- terraform - Terraform:使用 AWS ECS 服务附加多个目标组时出现 IAM 角色错误
- vaadin - 如何在提供文件以供 vaadin 下载之前通过 StreamResource 提供等待图像/弹出窗口
- javascript - 当输入的大小增加时如何使按钮移动
- embedded-linux - 更改我系统的通用 I/O 的角色
- node.js - Strapi Heroku 部署无法连接到 MongoDB
- ggplot2 - 如何在 R 中的 position_dodge2 之后消除条之间的额外空格