2014-09-15 3 views
0

У меня есть рабочее приложение «полагающаяся сторона», которое использует провайдер третьей стороны OpenID для входа. Однако, если я попытаюсь войти в систему с помощью «домашнего» OpenID провайдера, который использует org.openid4java.server.SampleServer, сеанс не поддерживается между beginConsumption и endConsumption.openid RP не поддерживает сеанс между вызовами провайдера

я могу видеть успешное открытие и ассоциации, с этим было достигнуто в пружинах OpenID4JavaConsumer:

DiscoveryInformation information = consumerManager.associate(discoveries); 
req.getSession().setAttribute(DISCOVERY_INFO_KEY, information); 

Но после того, как мой OP делает аутентификации и response.sendRedirect «S обратно в РП, новая сессия началась, и я получить отказ в на 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"); 
} 

Что вызывает этот новый сеанс, который будет создан, и как я могу держать свою старую сессию?

ответ

0

я смог пройти мимо этого с этим в коде 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 или docs не упомянули об этом как о возможной необходимости, что заставило меня задаться вопросом, является ли моя настройка «неправильной» каким-то другим способом. Вперед ...