我有一个Android / iOS SDK,通过App Engine和Cloud Endpoints与我的后端通信。我想限制对已创建帐户的开发人员的访问权限,并生成“API密钥”(引号中,因为我不确定需要采用何种形式)与我的后端进行交互。我还想跟踪请求来自哪个开发人员/应用程序,因此我想为每个开发人员提供一个唯一的密钥。
Cloud Endpoints使用SSL,因此我可以简单地生成公共和私有API密钥作为加密安全随机数,并将其包含在我的请求正文中,由我的后端授权,这些密钥存储在某处?
同样,我不感兴趣保护请求在从客户端到我的服务器的过程中,而是授权“用户”(在这种情况下,开发人员)。非常感谢此方案的任何反馈/见解/最佳实践。
-
编辑:不确定代码是否真的有用,但这是我的API的精简版本。
public class MyApi {
public MyApi() {
}
public CEDataTransformResponse transformData(CEDataTransformRequest request) throws UnauthorizedException {
CERequestHeader header = request.getHeader();
if (header == null) {
throw new UnauthorizedException("Missing header.");
}
authorizeToken(header.getToken());
CEDataTransformResponse out = processRequestBody(request.getBody());
return out;
}
private void authorizeToken(CEApiToken token) throws UnauthorizedException {
// Current way
if (!token.getToken().equals(Constants.TOKEN)) {
throw new UnauthorizedException("Unauthorized");
}
// Future way?
String apiKey = token.getApiKey(); String apiSecret = token.getApiSecret();
if !((mDatastore.containsKey(apiKey)) && (mDatastore.getValue(apiKey) == apiSecret)) {
throw new UnauthorizedException("Unauthorized");
}
}
}
在“未来的方式”中,假设mDatastore
是键值存储的一些包装器。我忽略了我会做的任何哈希。
我已经考虑过在Cloud Platform开发人员控制台中生成客户端ID,但这太过于手动;当新开发者注册/下载我的sdk /请求密钥时,这需要以编程方式进行。
答案 0 :(得分:0)
好的,这里有几点。
使用SO时,您应该发布代码。问题需要采取特定编程问题的形式,10次中有9次,这意味着发布您的代码。
无论如何,您需要展示自己的所作所为,已完成的研究以及当前的错误/障碍。发布问题时请记住这一点,因此请更新您当前的问题。
关于您的问题,您的“API密钥”实际上只是一个“用户”。创建登录系统,并使用OAUTH进行授权。您可以跟踪用户并向他们提供所需的任何凭据。同样,OAUTH应该具有在传输过程中保护数据的额外好处。