openid RP не поддерживает сеанс между звонками провайдеру
У меня есть работающее приложение "проверяющая сторона", в котором используется третья сторона OpenID
провайдер для входа. Однако, если я попытаюсь войти в систему с "доморощенным" OpenID
провайдер, который использует org.openid4java.server.SampleServer
сеанс не поддерживается между beginConsumption
а также endConsumption
,
Я вижу успешное открытие и ассоциацию, причем это достигается весной OpenID4JavaConsumer
:
DiscoveryInformation information = consumerManager.associate(discoveries);
req.getSession().setAttribute(DISCOVERY_INFO_KEY, information);
Но после моего ОП делает аутентификацию и response.sendRedirect
возвращается к RP, там начинается новый сеанс, и я получаю ошибку в OpenID4JavaConsumer.endConsumption
:
DiscoveryInformation discovered =
(DiscoveryInformation) request.getSession().getAttribute(DISCOVERY_INFO_KEY);
if (discovered == null) {
throw new OpenIDConsumerException("DiscoveryInformation is not available. Possible causes are lost session or replay attack");
}
Что вызывает создание этого нового сеанса и как я могу сохранить свой старый сеанс?
1 ответ
Я смог пройти мимо этого с помощью кода OP:
Cookie sessionCookie = getSessionCookie(request.getCookies());
if (sessionCookie != null) {
response.addCookie(sessionCookie);
}
String url = response.encodeRedirectURL(responseBody);
response.sendRedirect(url);
а также
private Cookie getSessionCookie(Cookie[] cookies) {
for (Cookie cookie : cookies) {
if (cookie.getName().equalsIgnoreCase("JSESSIONID")) {
return cookie;
}
}
return null;
}
На первый взгляд, это имеет смысл, но все же кажется загадочным, что класс или документы OpenId SampleServer не упомянули об этом как о возможной необходимости, что заставляет меня задуматься о том, "неправильно" ли мои настройки каким-либо другим способом. Onward...