为App Engine后端生成API密钥

我有一个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");
    }
  }
}

在"future way"中,想象 mDatastore 是键值存储的一些包装器 . 我忽略了我会做的任何哈希 .

我已经考虑在Cloud Platform开发人员控制台中生成客户端ID,但这太过于手动;当新开发者注册/下载我的sdk /请求密钥时,这需要以编程方式进行 .

回答(1)

2 years ago

好的,这里有几点 .

  • 使用SO时,您应该发布代码 . 问题需要采取特定编程问题的形式,10次中有9次,这意味着发布您的代码 .

  • 无论如何,您需要展示您已完成的工作,已完成的研究以及您当前的错误/障碍 . 在发布问题时请记住这一点,因此,请更新您当前的问题 .

  • 关于您的问题,您的“API密钥”实际上只是一个“用户” . 创建登录系统,并使用OAUTH进行授权 . 您可以跟踪用户并向他们提供所需的任何凭据 . 同样,OAUTH应该具有在传输过程中保护数据的额外好处 .