Как вернуть пользовательские сообщения об ошибках во внешний интерфейс в пользовательском spnego Authenticator в Keycloak (3.4.3)? - PullRequest
0 голосов
/ 05 июня 2018

Я создаю пользовательский аутентификатор в Keycloak, который регистрирует пользователя не только в SSO-экземпляре Keycloaks, но и в устаревшей (SAP-) системе через rest-Call.

Теперь я получаю сообщения об ошибках от этого унаследованного API и хочу отобразить сообщения (которые интернационализированы callee-param) конечному пользователю при входе в систему через мой пользовательский аутентификатор, но я не понимаю, каксделай это, пока.

Я думаю, что это как-то связано, например, со следующими строками из spnego authenticator на github :

...
else {
            context.getEvent().error(Errors.INVALID_USER_CREDENTIALS);
            context.failure(AuthenticationFlowError.INVALID_CREDENTIALS);
}
...

при изменении значения .error () на"тестовое задание!"это регистрируется, но ошибка, отображаемая пользователю, также является неверной строкой учетных данных.Итак, AuthenticationFlowError, по-видимому, является ENUM, который не будет работать с динамическими интернационализированными сообщениями от третьих сторон, я думаю.Но есть ли способ сообщить моему тексту аутентификации вернуть сообщение об ошибке из моей третьей сторонней системы?

Любая помощь высоко ценится

1 Ответ

0 голосов
/ 05 июня 2018

Итак, глядя на keycloak-sources (opensource ftw!), Я только что узнал, как это сделать:

Вместо строк выше, можно сделать это так:

 else {
   //errorresponse from restcall to thirdparty-api (just removing prefix here)
   responseString = responseString.replace("sap_error_", "");

   //actually I try to do a somewhat silent idplogin, so this might fit. 
   //you can change this error to the errormsg from thirdparty, too,
   // so its collected in the logs error=-part.
   context.getEvent().error(Errors.IDENTITY_PROVIDER_ERROR);

   //here we're building the actual responseHandler.
   //One might even want to set the status to status from thirdparty. 
   Response challengeResponse = context.form().setError(responseString)
                .createErrorPage(Response.Status.INTERNAL_SERVER_ERROR);

   //And in the end we apply the failureChallenge to the Context  
   context.failureChallenge(AuthenticationFlowError.IDENTITY_PROVIDER_ERROR,
                                     challengeResponse);
}

Я прокомментировал код, чтобы прояснить, что сделано.

С уважением, Доминик

...