Я устанавливаю API для серверной части нашего приложения. Я хочу ограничить доступ к API для моих пользователей. Мы используем Keycloak в качестве нашего поставщика единого входа. Мы также требуем, чтобы каждый запрос API шел с токеном JWT. Я нашел в Интернете некоторую документацию о том, как проверять эти токены через Keycloak AuthzClient здесь .
Я написал небольшой тест, чтобы попробовать это. Я взял токен из одного из моих запросов API и передаю его AuthzClient для проверки.
public static void main(String[] args) throws FileNotFoundException, IOException {
System.setProperty("org.apache.commons.logging.Log","org.apache.commons.logging.impl.SimpleLog");
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.wire", "DEBUG");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.impl.conn", "DEBUG");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.impl.client", "DEBUG");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.client", "DEBUG");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "DEBUG");
AuthzClient authzClient = AuthzClient
.create(JsonSerialization.readValue(new FileInputStream("keycloak.json"), Configuration.class));
TokenIntrospectionResponse requestingPartyToken = authzClient.protection()
.introspectRequestingPartyToken(TOKEN);
System.out.println("Token status is: " + requestingPartyToken.getActive());
}
Однако ответ, возвращаемый Keycloak, указывает на то, что токен не может быть проанализирован правильно.
2019/01/16 13:58:35:349 CET [DEBUG] wire - http-outgoing-0 >> "token_type_hint=requesting_party_token&grant_type=client_credentials&token=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJZRVdnTzZzamtlU3laQnZJd1Yzek1ZNjJtTjU2QlN6NlJYUXhxVmlrczdvIn0.eyJqdGkiOiI5MWVmM2VmOC02ZDNhLTRjMjktODRhOS1hMzlhZmM3OWMyZDMiLCJleHAiOjE1NDc2MzUyOTQsIm5iZiI6MCwiaWF0IjoxNTQ3NjM0Mzk0LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgxODAvYXV0aC9yZWFsbXMvbTRpIiwiYXVkIjoibTRpX3RoaWpzIiwic3ViIjoiZmViNmVlNjUtYWU4Ni00ZWQwLWI3YjAtYWE0YmE3ZjIxYmQ1IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibTRpX3RoaWpzIiwibm9uY2UiOiI3YmVlOTZjNi1jODJmLTQyMTMtOGYxYi1hNWM5NjczNjhmM2EiLCJhdXRoX3RpbWUiOjE1NDc2MzAyNDksInNlc3Npb25fc3RhdGUiOiI4OTg5ZDFlNS04NGQ0LTRlMWQtOGE2ZC0zODhlYTYxYzM0ZTciLCJhY3IiOiIwIiwiYWxsb3dlZC1vcmlnaW5zIjpbIioiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm00aV9wdWJsaWMiXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0aGlqc2ZyYW5jayIsImdpdmVuX25hbWUiOiJUaGlqcyIsImZhbWlseV9uYW1lIjoiRnJhbmNrIiwiZW1haWwiOiJ0aGlqcy5mcmFuY2tAYXVyZWxpdXNlbnRlcnByaXNlLmNvbSJ9.GBaBOLWYsrqfVfRysoCTlm9VgD1AQocMDCAY96-peeAYRT9_RRu2mTtwiNlB4Gv7cCKkcj4jehKOiOUBudlS0Ths_hTKigHW-eyo_KTMwVYgq0YeVce8UG1F9SJQrioMBRUS47Au-4syjpp158pVvzdPcYBUD5-bzOTusxtGaEcK4rnCYolq_h6PV6eypr9ej2-mFu_EXHPT0m7TNUeb8IlSJ53wb0W5q1R696UExfp9DiKehYGKuY8LuRx9n9Ao0r1P_GSENWNfQBKExCVGOEDCqDZ02-3jx8PqLcykWpdEOTo3RPUi2-HXgwyGO4UeL8proG0tdUEn4Oo12znlzQ"
2019/01/16 13:58:35:358 CET [DEBUG] wire - http-outgoing-0 << "{"error":"invalid_request","error_description":"Failed to introspect token."}"
Основное различие между моим тестом и онлайн-примером заключается в том, что я не генерирую новый токен, но использую токен, сгенерированный ранее. Используемый токен также генерируется для клиента, отличного от нашего RestAPI. Возможно, это не разрешено?
Что мне еще нужно изменить, чтобы самоанализ стал успешным?