【问题标题】:The apiKeyRequired is not working in Google Cloud Endpoints projectapiKeyRequired 在 Google Cloud Endpoints 项目中不起作用
【发布时间】:2018-12-15 12:10:00
【问题描述】:

我有一个配置了 Cloud Endpoints Framework 的 java 8 项目。

我在这里关注了文档:https://cloud.google.com/endpoints/docs/frameworks/java/get-started-frameworks-java

我尝试使用 API 密钥保护 API。我在这里遵循了文档:https://cloud.google.com/endpoints/docs/frameworks/java/restricting-api-access-with-api-keys-frameworks

问题是我总是可以访问端点,无论我是否设置了 API 密钥。

这里是 API:

@Api(
        name = "myApi",
        title = "My API",
        version = "v1",
        description = "My API description",
        apiKeyRequired = AnnotationBoolean.TRUE
)
public class MyApiEndpoint {
    @ApiMethod(httpMethod = GET, path = "list", apiKeyRequired = AnnotationBoolean.TRUE)
    public ApiEntityList list() throws Exception {
        return new ApiEntityList();
    }
}

这里是 web.xml:

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<filter>
    <filter-name>endpoints-api-controller</filter-name>
    <filter-class>com.google.api.control.extensions.appengine.GoogleAppEngineControlFilter</filter-class>
    <init-param>
        <param-name>endpoints.projectId</param-name>
        <param-value>${app.deploy.project}</param-value>
    </init-param>
    <init-param>
        <param-name>endpoints.serviceName</param-name>
        <param-value>${app.deploy.project}.appspot.com</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>endpoints-api-controller</filter-name>
    <servlet-name>EndpointsServlet</servlet-name>
</filter-mapping>

<filter>
    <filter-name>endpoints-api-configuration</filter-name>
    <filter-class>com.google.api.control.ServiceManagementConfigFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>endpoints-api-configuration</filter-name>
    <servlet-name>EndpointsServlet</servlet-name>
</filter-mapping>

<servlet>
    <servlet-name>EndpointsServlet</servlet-name>
    <servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class>
    <init-param>
        <param-name>services</param-name>
        <param-value>com.myproject.MyApiEndpoint</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>EndpointsServlet</servlet-name>
    <url-pattern>/_ah/api/*</url-pattern>
</servlet-mapping>

appengine-web.xml:

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <runtime>java8</runtime>
    <threadsafe>true</threadsafe>
    <service>core</service>
    <url-stream-handler>urlfetch</url-stream-handler>
    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>
    <env-variables>
        <env-var name="ENDPOINTS_SERVICE_NAME" value="${app.deploy.project}.appspot.com" />
    </env-variables>
</appengine-web-app>

我在 Google Cloud Platform 项目中创建了 API Key 作为新凭据,没有任何限制。

我可以在 GCP 上部署的 openapi.json 文件中看到以下几行:

  "/myApi/v1/list": {
   "get": {
    "operationId": "MyApiList",
    "parameters": [ ],
    "responses": {
     "200": {
      "description": "A successful response",
      "schema": {
       "$ref": "#/definitions/ApiEntityList"
      }
     }
    },
    "security": [
     {
      "api_key": [ ]
     }
    ]
   }
  },
  "securityDefinitions": {
    "api_key": {
      "type": "apiKey",
      "name": "key",
      "in": "query"
    }
  },

下面的所有电话都没有被拒绝,但我希望它们是:

看起来apiKeyRequired注解参数没有任何作用。

我在这里错过了什么吗?

【问题讨论】:

  • 您能否粘贴请求的示例日志和完整的 OpenAPI 文档?
  • 您找到解决方案了吗?
  • 即使文档清楚地说明要添加 apiKeyRequired 参数,它似乎也不起作用

标签: java google-cloud-platform api-key google-cloud-endpoints-v2


【解决方案1】:

对于将来查看此问题的任何人.. 我遇到了同样的问题,结果发现我更改了 @ApiMethod 中指定的路径,并且没有将新的 openAPI 文档部署到 Cloud Endpoints。

我已使用mvn appengine:deploy 将我的项目部署到 App Engine,但我忘记了我还需要按照Deploying the Endpoints Configuration 上的此文档重新部署我的 openAPI 文档。所以它仍然使用我最初部署的旧资源/路径。当我将我的 openAPI 文档基本路径和 @ApiMethod 注释中的路径修复为我想要的时,我将其部署到 Cloud Endpoints,然后 apiKeyRequired 注释再次起作用!

【讨论】:

    【解决方案2】:

    我认为您没有使用默认的应用引擎服务,而是使用了一个名为“core”的服务,通过您的 URL。

    如果这是真的,那么我认为您需要更新以下内容以配置端点框架以了解要应用于哪个服务:

    1. web.xml:

    com.google.api.control.extensions.appengine.GoogleAppEngineControlFilter 的过滤器定义中参数名称 endpoints.serviceName 的参数值,以在 ${app.deploy.project}.appspot.com 之前包含服务名称

    <filter>
        <filter-name>endpoints-api-controller</filter-name>
        <filter-class>com.google.api.control.extensions.appengine.GoogleAppEngineControlFilter</filter-class>
        <init-param>
            <param-name>endpoints.projectId</param-name>
            <param-value>${app.deploy.project}</param-value>
        </init-param>
        <init-param>
            <param-name>endpoints.serviceName</param-name>
            <param-value>core-dot-${app.deploy.project}.appspot.com</param-value>
        </init-param>
    </filter>
    
    1. appengine.web.xml:

    ENDPOINTS_SERVICE_NAME 的环境变量值包含${app.deploy.project}.appspot.com 之前的服务名称

    <env-variables>
        <env-var name="ENDPOINTS_SERVICE_NAME" value="core-dot-${app.deploy.project}.appspot.com" />
    </env-variables>
    

    【讨论】:

      【解决方案3】:

      您确定您的 API 已启用吗?我的意思是,当您创建 Cloud Endpoints 项目时,它还会有效地将这些端点声明为“私有 API”。然后您必须启用它才能使 API 密钥生效

      • 在您的控制台中,输入“APIs & Services”
      • 单击“+ 启用 API 和服务”||侧边菜单中的“库”
      • 在私有 API 的侧边菜单中单击“私有”
      • 您应该(希望)能够看到您通过 Cloud Endpoints 创建的“API”

      对于某些人来说,它似乎是自动完成的,但似乎有相当数量的人不是。老实说,我不知道为什么会这样。

      希望有帮助!

      【讨论】:

        【解决方案4】:

        我只是在测试它,并通过在openapi.json 文件中添加除了 api 注释之外的顶级安全指令来使其工作。它应该看起来像这样:

        {
         "swagger": "2.0",
         "info": {
          "version": "1.0.0",
          "title": "<PROJECT_ID>.appspot.com"
         },
         "host": "<PROJECT_ID>.appspot.com",
         "basePath": "/_ah/api",
         "schemes": [
          "https"
         ],
         "security": [
             {
              "api_key": [ ]
             }
         ], 
        

        之后我再次运行部署 $ gcloud endpoints services deploy target/openapi-docs/openapi.json$ mvn appengine:deploy

        【讨论】:

        • 感谢您的回答,但这并没有改变任何事情
        猜你喜欢
        • 2018-03-19
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2017-03-18
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        • 2013-09-14
        相关资源
        最近更新 更多