Вопросы:
1) Какой лучший способ интегрировать аутентификацию OpenID Connect в веб-приложение, использующее Spring Безопасность для аутентификации?
2) Есть ли какой-либо способ - либо из MITREid стороны, либо из стороны в аккаунтах Google - получить фильтр проверки подлинности MITREid OpenID Connect работать с сервисом Google OpenID Connect?
Я уверен, что ответы на эти вопросы будут полезны для любого разработчика, который использует модуль OpenID модуля Spring для аутентификации с Google.
Деталь:
Мой webapp использует Spring модуль безопасности OpenID (<openid-login .../>
) для аутентификации с учетными записями Google в качестве поставщика удостоверений. т.е. пользователи аутентифицируются с использованием своего адреса Google Apps или GMail.
В последнее время, когда пользователи аутентифицируются, они получают это предупреждение от учетных записей Google:
Важное замечание: OpenID2 для аккаунтов Google уходит в апреле 20, 2015 г.
Таким образом, Google отказывается от поддержки OpenID, полностью отключит его в апреле 2015 года и заявляет, что вы должны перейти на протокол OpenID Connect, если хотите выполнить аутентификацию с помощью учетных записей Google.
Я надеялся, что Spring У безопасности будет встроенная поддержка OpenID Connect, так же как и встроенная поддержка OpenID. например что-то вроде элемента <openid-connect-login .../>
. Но мои поиски не получили такой поддержки.
Лучшим кандидатом, который я нашел до сих пор, является MITREid Connect. Он включает в себя Spring фильтр проверки подлинности безопасности с именем OIDCAuthenticationFilter
для OpenID Connect. Проблема в том, что она не взаимодействует с реализацией Google OpenID Connect.
Я попробовал клонирование простого веб-приложения MITREid и настроил его для аутентификации (с помощью OpenID Connect) с учетными записями Google. Но это не сработало, потому что это зависит от nonce, которую не поддерживает реализация Google OpenID Connect. Сообщение об ошибке из аккаунтов Google:
Параметр, не разрешенный для этого типа сообщения: nonce
Далее я попытался подключить собственную реализацию интерфейса MITREid AuthRequestUrlBuilder
в конфигурацию MITREid. Единственная разница между моей реализацией и реализацией MITREid заключалась в том, что я не отправил nonce.
Не отправляя незапланированную реализацию Google OpenID Connect счастливой, но MITREid выбрал исключение, если не смог найти nonce в ответе проверки подлинности Google. Сообщение об ошибке:
Ошибка аутентификации: токен идентификатора не содержит требования nonce
Я отслеживал исключение MITREid до этих строк в MITREID OIDCAuthenticationFilter
:
// compare the nonce to our stored claim
String nonce = idClaims.getStringClaim("nonce");
if (Strings.isNullOrEmpty(nonce)) {
logger.error("ID token did not contain a nonce claim.");
throw new AuthenticationServiceException("ID token did not contain a nonce claim.");
}
Но мне не удастся расширить реализацию MITREid, чтобы игнорировать nonce. Так близко, но пока! Если учетные записи Google согласятся с тем, что nonce или MITREid могут быть настроены на игнорирование nonce, тогда у нас будет решение.
В списке проблем MITREid Connect в github я обнаружил, что другие сталкиваются с подобными проблемами:
1) # 726 - Документация по использованию клиента с Google в качестве поставщика проверки подлинности
2) # 704 - добавьте атрибут useNonce в ServerConfiguration, чтобы указать, принимает ли IdP значение nonce в свои запросы.
Итак, я застрял. Приезжайте в апреле 2015 г. Google завершит проверку подлинности Open ID.
Некоторые релевантные ссылки:
1) https://support.google.com/accounts/answer/6135882
2) https://www.tbray.org/ongoing/When/201x/2014/03/01/OpenID-Connect
3) https://github.com/mitreid-connect
4) https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/blob/master/openid-connect-client/src/main/java/org/mitre/openid/connect/client/OIDCAuthenticationFilter.java
5) https://github.com/mitreid-connect/simple-web-app
6) https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/blob/master/openid-connect-client/src/main/java/org/mitre/openid/connect/client/service/impl/PlainAuthRequestUrlBuilder.java
7) https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/issues/726
8) https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/pull/704
2015-02-18 Обновление
Функциональность недавно была добавлена в ветку разработки mitreid-connect для отключения nonce - поэтому делает OIDC-сервер Google счастливым. К счастью, mitreid-connect также предоставил некоторые рекомендации по взаимодействию с Google. К сожалению, изменение "nonceEnabled" пока недоступно в Maven, но, надеюсь, это скоро изменится.