У меня есть Spring api, который защищен с использованием проверки подлинности base64 через базу данных. Можно ли затем взять еще один апри и каким-то образом пройти аутентификацию через первый апи?Аутентификация Spring Rest API через другой API REST
ответ
Base64 - это механизм кодирования, а не схема аутентификации. Я предполагаю, что вы имеете в виду, что используете basic authentication, который является именем пользователя и паролем base64, закодированным в HTTP-заголовке Authorization
.
Если другая служба также использует базовую аутентификацию и проверяет имя пользователя и пароль на одну и ту же базу данных учетных данных, вы сможете использовать одну и ту же строку с кодировкой base64 для аутентификации против другой службы REST.
Все, что мне нужно было сделать, это иметь класс в моем втором API, который ловит все запросы, вызывая первый API, у которого уже есть соединение с моей базой данных, отправка основного заголовка проверки подлинности для проверки учетных данных.
Рассматривали ли вы защиту своих API с помощью аутентификации на основе OAuth и управления ключами API. HTTP Basic аутентификация не считает идеальной из и имени пользователя и пароля security perspective имеет другой набор security issues for APIs
В любом случае, вы можете рассмотреть возможность использования Stormpath сделать это очень легко для вас. Взгляните на this guide, он поддерживает как HTTP basic, так и OAuth.
Этот образец кода даст вам хорошее представление о том, насколько это просто.
Предположим, вы хотите открыть операцию под названием startEngines()
и хотите ее защитить. Вам также необходимо будет открыть новую операцию, чтобы получить токены доступа, в этом примере String getAccessToken(ApiKey)
.
Ваши пользователи будут запускать что-то вроде этого:
@Test
public void executeSomeOauth2AuthenticatedOperation() {
String userApiKeyPath = System.getProperty("user.home") + "/.stormpath/apiKey_4Yrc0TJ5sBFldwtu6nfzf5.properties";
ApiKey userApiKey = ApiKeys.builder().setFileLocation(userApiKeyPath).build();
//Developer requests access token
String accessToken = getAccessToken(userApiKey);
//Developer executes an authenticated operation (e.g startEngines()) with the provided accessToken
if (startEngines(accessToken)) {
System.out.print("Client-side message: Execution allowed");
} else {
System.out.print("Client-side message: Execution denied");
}
}
Ваш код будет выглядеть следующим образом:
String path = System.getProperty("user.home") + "/.stormpath/apiKey.properties";
String applicationUrl = "https://api.stormpath.com/v1/applications/2TqboZ1qo73eDM4gTo2H94";
Client client = Clients.builder().setApiKey(ApiKeys.builder().setFileLocation(path).build()).build();
Application application = client.getResource(applicationUrl, Application.class);
public String getAccessToken(ApiKey apiKey) {
HttpRequest request = createOauthAuthenticationRequest(apiKey);
AccessTokenResult accessTokenResult = (AccessTokenResult) application.authenticateApiRequest(request);
System.out.println(accessTokenResult.getScope());
return accessTokenResult.getTokenResponse().getAccessToken();
}
public boolean startEngines(String accessToken) {
HttpRequest request = createRequestForOauth2AuthenticatedOperation(accessToken);
try {
OauthAuthenticationResult result = application.authenticateOauthRequest(request).execute();
System.out.println(result.getAccount().getEmail() + " is about to start the engines!");
doStartEngines(); //Here you will actually call your internal doStartEngines() operation
return true;
} catch (AccessTokenOauthException e) {
//This accessToken is not allowed to start the engines
System.out.print("AccessToken: " + accessToken + " just tried to start the engines. He is not allowed to do so.");
return false;
}
}
private HttpRequest createOauthAuthenticationRequest(ApiKey apiKey) {
try {
String credentials = apiKey.getId() + ":" + apiKey.getSecret();
Map<String, String[]> headers = new LinkedHashMap<String, String[]>();
headers.put("Accept", new String[]{"application/json"});
headers.put("Content-Type", new String[]{"application/x-www-form-urlencoded"});
headers.put("Authorization", new String[]{"Basic " + Base64.encodeBase64String(credentials.getBytes("UTF-8"))});
Map<String, String[]> parameters = new LinkedHashMap<String, String[]>();
parameters.put("grant_type", new String[]{"client_credentials"});
HttpRequest request = HttpRequests.method(HttpMethod.POST)
.headers(headers)
.parameters(parameters)
.build();
return request;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private HttpRequest createRequestForOauth2AuthenticatedOperation(String token) {
try {
Map<String, String[]> headers = new LinkedHashMap<String, String[]>();
headers.put("Accept", new String[]{"application/json"});
headers.put("Authorization", new String[]{"Bearer " + token});
HttpRequest request = HttpRequests.method(HttpMethod.GET)
.headers(headers)
.build();
return request;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private void doStartEngines() {
System.out.println("Server-side message: Engines started!!!");
}
Для простоты я сделал все это код, выполняемый в той же машине (нет сетевая связь между клиентским и серверным кодом). Вам действительно нужно будет выставить startEngines()
и String getAccessToken(ApiKey)
через Rest API с помощью Spring и предоставить своим конечным пользователям доступ к ним через сеть.
Дайте ему попробовать, это должно быть довольно простое и быстрое решение. :)
Полный disclosure- Я работаю в Stormpath
- 1. аутентификация пользователя через REST API
- 2. Аутентификация Spring Rest
- 3. Аутентификация запроса API REST
- 4. Аутентификация приложения ASP.NET MVC через REST API
- 5. Аутентификация с помощью Rest API
- 6. Проверка Spring Rest API
- 7. Аутентификация с внешним REST api
- 8. Аутентификация Firebase через Rest
- 9. Аутентификация документовDB REST API вызывает
- 10. Office365 REST API Базовая аутентификация
- 11. Ошибка API Twilio REST - «Аутентификация»
- 12. Аутентификация API REST | AppID + AppSecret
- 13. Аутентификация для Azure REST Api
- 14. REST API - аутентификация против авторизации?
- 15. Как - Аутентификация API AWS Rest
- 16. JIRA REST API - базовая аутентификация
- 17. Аутентификация API REST API TFS 2015
- 18. API Spring Rest - несколько потоков
- 19. Spring Security с REST API
- 20. Подключение Google REST API через мой REST API не работает
- 21. Spring Java Web: REST API
- 22. Spring REST API и i18n
- 23. Тестирование Spring Boot REST API
- 24. Результаты покрытия через API REST
- 25. Звоните REST Api из REST Api (Node.js)
- 26. Частное видео через REST api
- 27. Azure Сайты Kudu REST API - Аутентификация
- 28. Spring Security Rest Базовая аутентификация
- 29. Аутентификация на основе токена REST API
- 30. Аутентификация с устройства Android против Spring Security Rest API
Кстати, бэкенд использует UserDetailsService –
почему бы не использовать OAuth? Это более безопасный способ, чем базовая аутентификация HTTP. Вот сообщение в блоге, которое может помочь. https://stormpath.com/blog/secure-your-rest-api-right-way/ – Alex