我想保护App Engine上的API,以便它只能从另一个服务器(托管在App Engine之外)访问。
谷歌在这里解释了这一点,但只展示了如何使用客户端id来保护我的https://cloud.google.com/appengine/docs/java/endpoints/consume_js#adding_authentication_support_with_oauth_20,以便安卓、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云端点框架以进行身份验证。
我正在寻找一种解决方案,我可以通用地使用任何语言,而不使用生成的云端点jar库,这通常是在Android上使用,只。
请描述我需要包装或签名的内容(可能是客户端机密),以及我需要将其放在https请求中的位置(可能在参数中),或者告诉我在哪里正确记录了整个云端点安全工作流程。
发布于 2015-02-01 16:06:05
您应该根据要在其上构建外部服务器上托管的应用程序的系统的SHA指纹,从开发人员控制台为web应用程序创建Client-Id。
然后将其包括在端点应用程序接口方法的允许客户端in列表中,以允许外部应用程序在方法定义之前使用@apiMethod注释访问端点应用程序接口:
@ApiMethod(name = "myEndpointMethod",
clientIds = {"clientid1", "clientid2"})
public void myEndpointMethod(){
...
}如果要对另一个App Engine应用程序进行身份验证,可以通过读取X-Appengine-Inbound-Appid标头并将其与允许发出请求的ID列表进行比较来检查传入请求的应用程序ID。
EDIT:似乎也可以使用App Engine在端点方法中注入的User对象来验证非Google帐户用户,但我从未这样做过。
https://stackoverflow.com/questions/28259885
复制相似问题