Конечные точки Google Cloud - метод API успешно вызывается только при удалении пользовательского параметра - PullRequest
0 голосов
/ 04 марта 2019

У меня есть метод API (написанный на Java) в приложении, которое развернуто как набор конечных точек, которые работают в Google Cloud.API использует OpenAPI и использует ESP ( Extensible Service Proxy ) для ретрансляции запросов от API и посредничества при любой аутентификации.

Я создал новый метод API, который выглядит следующим образом:

@ApiMethod(path="my/path/{param}",httpMethod = "get")
public Object[] GetSomethingUsingFirebaseAuthentication(@Named("param") String param) throws UnauthorizedException,BadRequestException,NotFoundException
{
     // implementation
}

Я могу отлаживать при запуске local с помощью Debug As> App Engine, и я могу вызвать метод какследует с помощью Postman, когда я отлаживаю с помощью 'debug as> app engine'.Я использую следующую настройку Почтальона (обратите внимание, что я передаю токен аутентификации в «носитель» заголовка авторизации):

enter image description here

Метод успешно вызван и возвращает успешный ответ, что доказывает, что я правильно вызываю метод и что он действителен.Если затем я добавлю параметр для принятия пользователя Firebase, как этот, метод завершится ошибкой:

@ApiMethod(path="my/path/{param}",httpMethod = "get")
public Object[] GetSomethingUsingFirebaseAuthentication(@Named("param") String param, User user) throws UnauthorizedException,BadRequestException,NotFoundException
{
     // some auth code based on the Firebase 'user'
}

Я вызываю метод теперь, когда я добавил параметр User, точно так же, как и до использования Postman,и теперь я получаю http 503 ошибку:

method_info is not set

Вот действительно HTTP-ответ JSON:

{
    "error": {
        "errors": [
            {
                "domain": "global",
                "reason": "backendError",
                "message": "backend error"
            }
        ],
        "code": 503,
        "message": "backend error"
    }
}

Проблема очень похожа на эту:

Конечные точки Google Cloud + Firebase Auth: method_info не задан

Разница в моей проблеме заключается в том, что проблема все еще возникает при развертывании API конечных точек впроизводственная среда.

У меня есть другие очень похожие методы API, которые принимают пользователя Firebase, и все они работают в производстве.Один из аналогичных методов API также работает, когда я отлаживаю его локально, поэтому мне не нужно менять конфигурацию.

Принятый ответ на поставленный выше вопрос (изменив отображение в web.xml, чтобы получить фильтр дляработа, которая должна внедрить method_info) не работает для меня.В любом случае, это было бы хаком для моей собственной проблемы, так как другие методы API, кажется, работают локально и в производстве.


Некоторое объяснение того, как это должно работать - ESP (Extensible Service Proxy), который является Google Cloud, является оберткой для API конечной точки и может обеспечивать аутентификацию с помощью токена Firebase для пользователя (в моем случае этот токен передается в заголовке Bearer of Authorization).После этого аутентифицированный пользователь Firebase должен быть передан в качестве аргумента user.


Вот полная трассировка стека

WARNING: exception occurred while invoking backend method
java.lang.IllegalStateException: method_info is not set in the request
    at com.google.api.server.spi.auth.EspAuthenticator.authenticate(EspAuthenticator.java:67)
    at com.google.api.server.spi.request.Auth.authenticate(Auth.java:101)
    at com.google.api.server.spi.request.ServletRequestParamReader.getUser(ServletRequestParamReader.java:205)
    at com.google.api.server.spi.request.ServletRequestParamReader.deserializeParams(ServletRequestParamReader.java:141)
    at com.google.api.server.spi.request.RestServletRequestParamReader.read(RestServletRequestParamReader.java:135)
    at com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:349)
    at com.google.api.server.spi.handlers.EndpointsMethodHandler$RestHandler.handle(EndpointsMethodHandler.java:119)
    at com.google.api.server.spi.handlers.EndpointsMethodHandler$RestHandler.handle(EndpointsMethodHandler.java:102)
    at com.google.api.server.spi.dispatcher.PathDispatcher.dispatch(PathDispatcher.java:50)
    at com.google.api.server.spi.EndpointsServlet.service(EndpointsServlet.java:72)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:287)
    at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:277)
    at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:182)
    at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:85)
    at com.google.api.control.ControlFilter.doFilter(ControlFilter.java:229)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at com.google.api.control.ConfigFilter.doFilter(ConfigFilter.java:120)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:119)
    at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:133)
    at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:130)
    at com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:203)
    at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:130)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:134)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:48)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at com.google.appengine.tools.development.jetty9.StaticFileFilter.doFilter(StaticFileFilter.java:123)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
    at com.google.appengine.tools.development.DevAppServerRequestLogFilter.doFilter(DevAppServerRequestLogFilter.java:44)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1634)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1340)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1242)
    at com.google.appengine.tools.development.jetty9.DevAppEngineWebAppContext.doScope(DevAppEngineWebAppContext.java:94)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at com.google.appengine.tools.development.jetty9.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:595)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:503)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
    at java.lang.Thread.run(Unknown Source)

Единственное предупреждение, которое я получаю в Eclipse при отладке, это

WARNING: No file found for: /_ah/start

Есть идеи о том, что может быть причиной этой проблемы, или на что я могу посмотреть?Любой совет о том, как я могу отладить или диагностировать проблему, действительно приветствуется:)

1 Ответ

0 голосов
/ 15 марта 2019

Файл OpenAPI для API конечных точек необходимо было сгенерировать и развернуть на конечных точках производства Google Cloud, чтобы аутентификация работала при локальной отладке.

$ mvn clean package endpoints-framework:openApiDocs -DskipTests
$ gcloud endpoints services deploy target/openapi-docs/openapi.json
$ mvn appengine:run

Локальная версияAPI конечных точек ссылается на производственную службу аутентификации Firebase, которая, в свою очередь, должна получать свою ссылку на API конечной точки из openapi.json в API конечных точек производства.

Из Google Обзор OpenAPI :

Документ OpenAPI описывает поверхность вашего REST API и определяет такую ​​информацию, как:

Имя и описание API.Отдельные конечные точки (пути) в API.Как аутентифицируются звонящие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...