如何保护App Engine端点以进行服务器到服务器的通信?

时间:2015-02-01 05:43:34

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

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

Google在此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库。

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

1 个答案:

答案 0 :(得分:1)

您应该根据构建外部服务器上托管的应用程序的系统的SHA指纹,从Developer Console创建Web应用程序的Client-Id。

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

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

public void myEndpointMethod(){
...
}

如果要对另一个App Engine应用程序进行身份验证,可以通过阅读X-Appengine-Inbound-Appid标头并将其与允许发出请求的ID列表进行比较来检查传入请求的应用程序ID。

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