2009-11-23 13 views
5

Estoy agregando el inicio de sesión de OpenID a una pequeña aplicación web utilizando Spring Security 2.0.5. Deseo poder identificar usuarios dentro de mi aplicación basados ​​en el identificador de OpenID con el que iniciaron sesión. Esto funciona bien cuando se usa Verisign como proveedor; cada identificador es un URI específico del usuario como http://jbloggs.pip.verisignlabs.com/, que se busca fácilmente en mi base de datos de usuario para encontrar "Joe Bloggs".¿Por qué mi aplicación OpenID recibe diferentes Google OpenID de diferentes máquinas cliente para el mismo usuario?

Sin embargo, cuando un usuario introduce el identificador de Google OpenID estándar (www.google.com/accounts/o8/id), el identificador enviado por Google tras la autenticación exitosa (algo así como https://www.google.com/accounts/o8/id?id=AItOawnKrvwaGk9YU0q9STQGj9G7XIRlNmsjuiI) varía de una máquina a para el mismo usuario. Esto hace que sea imposible (o al menos impracticable) identificar a ese usuario buscando su identificador en mi base de datos de usuario.

¿Cómo puedo conseguir que Google envíe siempre el mismo identificador para el mismo usuario de Google?

FWIW, la aplicación se ejecuta en JBoss 3.2.7 con Tomcat 5.0.28 incorporado.

+1

OpenID es una mierda, ¿estás de acuerdo? – jayarjo

+0

No, me gusta la conveniencia de la identidad federada. ¿Quién quiere recordar 50 nombres de usuario y contraseñas? O, lo que es peor, confíe el mismo nombre de usuario y contraseña a 50 sitios web, no todos en los que se puede confiar. –

+0

No digo que esa idea apesta. De hecho, es 'no'. Es genial. Incluso con todos los problemas potenciales. Creo que la implementación es floja y defectuosa, y difiere de proveedor a proveedor, como si no hubiera ningún estándar definido. – jayarjo

Respuesta

10

Google usa una característica de OpenID llamada identidad dirigida, lo que significa que Google crea un identificador nuevo, único e incorregible para cada RP (sitio web que acepte OpenID) en el que el usuario inicia sesión. Esta no es una opción, es la única forma en que Google funciona. La clave por la cual Google discierne entre los RP es el parámetro openid.realm, por lo que siempre que sea lo mismo, obtendrá los mismos identificadores para sus usuarios. Pero si alguna vez cambia el reino, se perderán todas las identidades de sus usuarios, ya que Google enviará un nuevo sitio de identificadores para sus usuarios existentes.

¿Qué puedes hacer al respecto? Dos opciones:

  1. mantener constante openid.realm por lo que los identificadores no cambian
  2. uso AX para 'exigir' dirección de correo electrónico de los usuarios cuando el proveedor es Google, y entonces usted puede hacer una correlación entre los identificadores de Google basado en la dirección de correo electrónico (sin embargo, es complicado: muchas ramificaciones de seguridad al hacer malabarismos entre los identificadores de correo abierto y de correo electrónico).
+2

El punto n. ° 1 lo resolvió por mí. Cuando probé mi aplicación desde el servidor, utilicé la URL http: // localhost/myapp, pero desde una segunda máquina utilicé http: // server_name/my app. Lo que no me di cuenta fue que Google vería esto como dos ámbitos diferentes y, por lo tanto, devolvería identidades diferentes para el mismo usuario de Google. Cuando cambié mi aplicación para usar SSL, tuve que usar "server_name" en la URL incluso desde el propio servidor debido al certificado SSL, y cuando comenzó a funcionar, asumí erróneamente que era gracias a SSL, no porque usé el mismo nombre de host de ambas máquinas. ¡Gracias por tu ayuda! –

+1

¿Ahora no es esto un desastre? Básicamente, es necesario manipular a cada proveedor de OpenID como si no existieran estándares o reglas de implementación en absoluto. – jayarjo

Cuestiones relacionadas