У меня есть SDK для Android/iOS, который взаимодействует с моим бэкендом через App Engine и Cloud Endpoints. Я хочу ограничить доступ к моему серверу разработчикам, которые создали учетную запись и сгенерировали «ключ API» (в кавычках, потому что я не уверен, какая форма требуется) для взаимодействия с моим бэкэнд. Я также хочу отслеживать, какой разработчик/приложение получил запрос, поэтому я хочу уникальный ключ для каждого разработчика.Создание ключей API для брандмауэра App Engine
Облачные конечные точки используют SSL, поэтому я могу просто сгенерировать открытый и закрытый ключ API как криптографически безопасное случайное число и включить их в тело моего запроса, чтобы быть авторизованым моим бэкэнд, который хранит эти ключи где-то?
Опять же, мне неинтересно защищать запрос при его переходе с клиента на мой сервер, а скорее разрешать «пользователю» (в данном случае разработчику). Поблагодарю любые отзывы/идеи/лучшие практики для этого сценария.
-
Edit: не уверен, что если код будет реально помочь, но вот урезанная версия моего 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, но это слишком ручно; это должно произойти программно, когда новый разработчик подписывает/загружает мой sdk/запрашивает ключ.
Добавлен код выше, но не уверен, что он сделает что-нибудь более четкое. Как я уже говорил выше, я просматривал идентификаторы клиентов через консоль разработчика, но это не работает для меня. Я также посмотрел на oAuth, хотя я думаю, что это не обязательно, потому что у меня будет система входа в систему, поэтому кажется, что избыточно генерировать токен доступа при входе в систему, а затем использовать этот токен, чтобы попасть в бэкэнд, когда я могу просто авторизовать непосредственно на некоторых входах на бэкэнд, как я предложил выше. – thegeebe