Итак, я нашел способ, но не смог найти никакой документации по этому поводу.
Этот пример кода предполагает, что Порталу облачных конечных точек требуется 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
Источники:
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"
}
}
}
}
}