Почему мое приложение OpenID получает разные идентификаторы Google OpenID с разных клиентских компьютеров для одного и того же пользователя?
Я добавляю логин OpenID в небольшое веб-приложение, используя Spring Security 2.0.5. Я хочу иметь возможность идентифицировать пользователей в моем приложении на основе идентификатора OpenID, с которым они вошли в систему. Это прекрасно работает при использовании Verisign в качестве поставщика; каждый идентификатор представляет собой пользовательский URI, такой как http://jbloggs.pip.verisignlabs.com/, который легко найти в моей пользовательской базе данных, чтобы найти "Joe Bloggs".
Однако когда пользователь вводит стандартный идентификатор Google OpenID (www.google.com/accounts/o8/id), идентификатор, отправляемый Google после успешной аутентификации (что-то вроде https://www.google.com/accounts/o8/id?id=AItOawnKrvwaGk9YU0q9STQGj9G7XIRlNmsjuiI) варьируется от машины к машине для одного и того же пользователя. Это делает невозможным (или, по крайней мере, непрактичным) идентификацию этого пользователя путем поиска его идентификатора в моей пользовательской базе данных.
Как я могу заставить Google всегда отправлять один и тот же идентификатор одному и тому же пользователю Google?
Кстати, приложение работает на JBoss 3.2.7 со встроенным Tomcat 5.0.28.
1 ответ
Google использует функцию OpenID, называемую направленной идентификацией, которая означает, что Google создает новый, уникальный и некоррелируемый идентификатор для каждого RP (веб-сайта, принимающего OpenID), в который входит пользователь. Это не вариант - это единственный способ работы Google. Ключ, по которому Google различает RP, - это параметр openid.realm, поэтому, если он одинаков, вы получите одинаковые идентификаторы для своих пользователей. Но если вы когда-либо измените область, идентификационные данные всех ваших пользователей будут потеряны, так как Google отправит новый сайт идентификаторов для ваших существующих пользователей.
Что вы можете с этим поделать? Два варианта:
- оставляйте openid.realm постоянным, чтобы идентификаторы не менялись
- используйте AX, чтобы "запрашивать" адрес электронной почты пользователей, если провайдер - Google, а затем вы можете сделать корреляцию между идентификаторами Google на основе адреса электронной почты. (хитро, хотя: много последствий для безопасности при манипулировании между идентификаторами openid и email).