Проблемы с аутентификацией на портале облачных конечных точек - PullRequest
0 голосов
/ 27 февраля 2020

В моем проекте App Engine реализована Cloud Endpoints Framework, и я хотел бы перейти с устаревшего API Explorer на новый портал конечных точек, но у меня возникла проблема с аутентификацией.

У меня есть одна конечная точка с включенной аутентификацией с токеном Google ID . Но когда пользователь нажимает «Try This API» на портале конечных точек, он не проходит аутентификацию. Это работает со старым API Explorer. enter image description here

Я использую проект, описанный в этом руководстве: https://cloud.google.com/endpoints/docs/frameworks/java/get-started-frameworks-java.

У него есть API-интерфейс, описанный в документации , и я выполнил эти шаги для аутентификации пользователей

Я добавил класс ниже к Пример кода для тестирования API с аутентификацией:

package com.example.echo;

import com.google.api.server.spi.auth.common.User;
import com.google.api.server.spi.config.Api;
import com.google.api.server.spi.config.ApiMethod;
import com.google.api.server.spi.response.UnauthorizedException;

@Api(
        name = "authenticatedApi",
        title = "Authenticated API",
        version = "v1",
        description = "Use OAuth 2.0 to authenticate",
        scopes = {"https://www.googleapis.com/auth/userinfo.email"},
        clientIds = {"*"}
)
public class AuthenticatedApi {

    @ApiMethod(name = "sayHello")
    public Message sayHello(User user) throws UnauthorizedException {
        if (user == null) {
            throw new UnauthorizedException("Invalid credentials");
        }

        Message message = new Message();
        message.setMessage("Hello " + user.getEmail());
        return message;
    }
}

Существует документация о том, как настроить портал для аутентификации, но ничего об OAuth 2.0

, который я генерирую и внедряю файл openapi. json с использованием плагина maven и gcloud:

$ mvn endpoints-framework:openApiDocs
$ gcloud endpoints services deploy target/openapi-docs/openapi.json

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Это текущий запрос функции для команды конечных точек Google Cloud:

https://issuetracker.google.com/issues/127623471

0 голосов
/ 04 марта 2020

Итак, я нашел способ, но не смог найти никакой документации по этому поводу.

Этот пример кода предполагает, что Порталу облачных конечных точек требуется ESP . Но в отличие от облачных конечных точек с OpenApi, Cloud Endpoints Framework не использует ESP , но:

- встроенный шлюз API, который предоставляет функции управления API, которые сопоставимы с функциями, которые ESP предоставляет конечные точки для OpenAPI

Поэтому в файле openapi. json, созданном mvn endpoints-framework:openApiDocs, отсутствует некоторая информация.

Вот что я изменил:

На уровне класса, в аннотации @Api:

  • добавил аудиторию (хотя у меня нет Android клиентов и, согласно документации , аудитории предназначены только для Android клиентов)
  • добавлен собственный аутентификатор для обработки ESP, аналогичный com.google.api.server.spi .auth.EspAuthenticator

В файле openapi. json, после того как он сгенерирован с помощью mvn endpoints-framework:openApiDocs

  • раздела securityDefinitions, authorizationUrl https://accounts.google.com/o/oauth2/v2/auth (в противном случае у меня была ошибка)
  • в объявлении пути моего метода, раздел безопасности с областью OAuth в нем

Источники:

API

package com.example.echo;

import com.google.api.server.spi.auth.common.User;
import com.google.api.server.spi.config.Api;
import com.google.api.server.spi.config.ApiMethod;
import com.google.api.server.spi.response.UnauthorizedException;

@Api(
        name = "authenticatedApi",
        title = "Authenticated API",
        version = "v1",
        description = "Use OAuth to authenticate",
        scopes = {"https://www.googleapis.com/auth/userinfo.email"},
        clientIds = {"*"},
        audiences = {"my-web-client-id.apps.googleusercontent.com"},
        authenticators = {CustomAuthenticator.class}
)
public class AuthenticatedApi {

    @ApiMethod(name = "sayHello")
    public Message sayHello(User user) throws UnauthorizedException {
        if (user == null) {
            throw new UnauthorizedException("Invalid credentials");
        }

        Message message = new Message();
        message.setMessage("Hello " + user.getEmail());
        return message;
    }
}

Anthenticator

package com.example.echo;

import com.google.api.auth.UserInfo;
import com.google.api.control.ConfigFilter;
import com.google.api.control.model.MethodRegistry;
import com.google.api.server.spi.auth.EndpointsAuthenticator;
import com.google.api.server.spi.auth.common.User;
import com.google.api.server.spi.response.ServiceUnavailableException;

import javax.servlet.http.HttpServletRequest;

public class CustomAuthenticator extends EndpointsAuthenticator {
    private final com.google.api.auth.Authenticator authenticator;

    public CustomAuthenticator() {
        // ESP needs another authenticator
        this.authenticator = com.google.api.auth.Authenticator.create();
    }

    @Override
    public User authenticate(HttpServletRequest request) throws ServiceUnavailableException {
        User user = super.authenticate(request);

        // Testing the user is enough for the API Explorer, not for the Endpoints Portal
        if (user == null) {
            try {
                MethodRegistry.Info methodInfo = ConfigFilter.getMethodInfo(request);
                MethodRegistry.AuthInfo authInfo = methodInfo.getAuthInfo().get();
                String serviceName = ConfigFilter.getService(request).getName();
                UserInfo userInfo = this.authenticator.authenticate(request, authInfo, serviceName);
                user = new User(userInfo.getId(), userInfo.getEmail());
            } catch (Exception e) {
                return null;
            }
        }
        return user;
    }
}

openapi. json

{
  "swagger": "2.0",
  "info": {
    "version": "1.0.0",
    "title": "My Application"
  },
  "host": "my-application.appspot.com",
  "basePath": "/_ah/api",
  "schemes": [
    "https"
  ],
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],
  "paths": {
    "/authenticatedApi/v1/sayHello": {
      "post": {
        "operationId": "AuthenticatedApiSayHello",
        "parameters": [],
        "responses": {
          "200": {
            "description": "A successful response",
            "schema": {
              "$ref": "#/definitions/Message"
            }
          }
        },
        "security": [
          {
            "google_id_token_https": ["https://www.googleapis.com/auth/userinfo.email"]
          }
        ],
        "x-security": [
          {
            "google_id_token_https": {
              "audiences": [
                "my-web-client-id.apps.googleusercontent.com"
              ]
            }
          }
        ]
      }
    }
  },
  "securityDefinitions": {
    "google_id_token_https": {
      "type": "oauth2",
      "authorizationUrl": "https://accounts.google.com/o/oauth2/v2/auth",
      "flow": "implicit",
      "x-google-issuer": "https://accounts.google.com",
      "x-google-jwks_uri": "https://www.googleapis.com/oauth2/v1/certs"
    }
  },
  "definitions": {
    "Email": {
      "properties": {
        "email": {
          "type": "string"
        }
      }
    },
    "Message": {
      "properties": {
        "message": {
          "type": "string"
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...