java - 如何保护用于服务器到服务器通信的 App Engine 端点?

标签 java security rest google-app-engine google-cloud-endpoints

我想保护 App Engine 上的 API,以便它只能从另一台服务器(在 App Engine 之外托管)访问。

谷歌在这里解释了这个https://cloud.google.com/appengine/docs/java/endpoints/consume_js#adding_authentication_support_with_oauth_20但仅展示了我如何使用客户端 ID 来保护我的 API 以供 Android、iOS 和 Webbrowsers/Javascript gapi 进行专有访问。

我假设如果我想使用 REST 访问 API 服务器到服务器,我将需要在 App Engine 控制台中创建一个“Web 应用程序的客户端 ID”,然后在端点注释中指定客户端 ID。 ..

@Api(
        name = "api",
        description = "API",
        namespace = @ApiNamespace(ownerDomain = "domain.com", ownerName = "Ownername")
        clientIds = { "clientidgoeshere" }
)

...并将用户参数添加到端点:

public void restMethodName(

        @Named("serverurl") String serverUrl, // whatever parameters

        final com.google.appengine.api.users.User auth
) throws ServiceException, OAuthRequestException {
    if (auth == null) throw new OAuthRequestException("Unauthorized error message.");

// ...

}

我相信到目前为止一切都很好。如果服务器端实现不正确,请告诉我原因。

现在我的问题是:我不知道我必须如何准备用户参数并将其传递给 App Engine 云端点框架以进行身份​​验证。

我正在寻找一种可以在任何语言中通用使用的解决方案,而无需使用通常仅在 Android 上使用的生成的 Cloud Endpoints jar 库。

请描述我需要包装或签名的内容(可能是客户端 secret )以及我需要将其放置在我的 https 请求中的位置(可能是在参数中),或者告诉我整个 Cloud Endpoints 安全工作流程的正确记录位置。

最佳答案

您应该根据在其上构建托管在外部服务器上的应用程序的系统的 SHA 指纹,从开发人员控制台为 Web 应用程序创建一个 Client-Id。

然后将其包含在端点 API 方法允许的客户端 ID 列表中,以允许外部应用程序在方法定义之前使用 @apiMethod 注释访问您的端点 API:

@ApiMethod(name = "myEndpointMethod",
        clientIds = {"clientid1", "clientid2"})

public void myEndpointMethod(){
...
}

如果您想验证另一个 App Engine 应用程序,您可以通过读取 X-Appengine-Inbound-Appid header 并将其与允许的 ID 列表进行比较来检查传入请求的应用程序 ID提出请求。

编辑:似乎也可以在端点方法中使用 App Engine 注入(inject)的用户对象来验证非 Google 帐户用户,但我从未这样做过。

关于java - 如何保护用于服务器到服务器通信的 App Engine 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28259885/

相关文章:

java - 状态码 415 : No MessageBodyReader Found for multipart/form-data, FormDataMultiPart

javascript - 如何向 Angular 资源添加回调?

java - 如何获取与 Selenium webdriver 中的复选框关联的标签?

java - 从 ECPrivateKey 生成 ECPublicKey

node.js - React Native 在有/没有 wifi 的情况下获取不同的结果

security - 您将如何攻击域来寻找 "unknown"资源?

security - 如何在使用 OAuth2 的资源所有者密码凭据授予类型时保持客户端凭据的 secret 性

java - 从一个类到外部类的指针?

JScrollPane 中的 Java JPanel?

java - 将值配置到用 Java 编写的 AWS Lambda 中