2009-10-08 24 views
7

Esta es una pregunta de la base de datos. Tengo una biblioteca abierta ya instalada y en funcionamiento.Almacenamiento de información de OpenID en la base de datos

Quiero utilizar OpenID en un sitio web en el que estoy trabajando. Hay tres tipos de usuarios.

  1. cuentas con nombre utilizando el correo electrónico/contraseña para autenticar
  2. cuentas con nombre usando OpenID para autenticar
  3. cuenta anónima usando OpenID para autenticarse

Todos estos usuarios se almacenan en la misma mesa para simplemente la tabla de comentarios. Las cuentas con nombre están vinculadas a un blog que la cuenta puede administrar. Los usuarios anónimos pueden comentar artículos en el blog pero no pueden hacer nada más. Si un usuario anónimo se registra en una cuenta, quiero transferir automáticamente los comentarios anteriores de ese usuario a la cuenta indicada. Actualmente estoy haciendo esto al hacer que los usuarios llenen un formulario con un nombre único y un correo electrónico válido.

Actualmente, ambos conjuntos de cuentas se almacenan en la misma tabla utilizando el siguiente esquema. (Sí, es una migración rieles)

create_table :users do |t| 
    t.string :name #unique because it maps to a subdomain 
    t.string :openid_url #unique 
    t.string :email #unique 
    t.string :password_hash 
    t.string :password_salt 
    t.boolean :guest #Anonymous user flag 

    t.timestamps 
end 

(openid_url es único para evitar múltiples cuentas de ser unidos al mismo openid. email es único ya que los usuarios de inicio de sesión con el correo electrónico/contraseña)

estoy usando este configuración Me he encontrado con un problema con la implementación de OpenID de Google. Todos los usuarios que usan Google para OpenID tienen la misma url: https://www.google.com/accounts/o8/ud.

¿Cómo apoyo el uso de google como proveedor de código abierto ya que sus URL no son exclusivas para cada usuario? (Recuerde las restricciones que existen)

Nota: Las cuentas de Google pueden usar cualquier dirección de correo electrónico válida en Internet, así que no puedo simplemente almacenar [email protected] en el campo openid_url porque el correo electrónico podría ser persona @ ejemplo. com o peor [email protected]! Yahoo también usa este único método de url, así que también tengo que apoyarlos.

+0

¿Por qué dices que las direcciones de correo electrónico son únicas? Puede que no lo sean ¿Qué sucede si ve un segundo registro abierto y el usuario reclama la misma dirección de correo electrónico que ya tiene? –

+0

El correo electrónico es para cuentas con nombre que no usan openid. Desde entonces, he cambiado mi aplicación para usar openid exclusivamente. (Creo que suficientes personas tienen cuentas de Google/Yahoo que no tendré ningún problema con esto). – epochwolf

Respuesta

8

Almacenar el valor openid.claimed_id. Es único por usuario. Los OpenID de Google son realmente únicos. Todos comienzan con el mismo valor, pero tienen cadenas únicas de consulta ?id=uniquenesshere. Recuerde que estos valores deben considerarse sensibles a las mayúsculas y minúsculas, por lo tanto, conserve las mayúsculas y minúsculas en el caso cuando busque usuarios.

Definitivamente no quiere considerar direcciones de correo electrónico para ser único, por las razones que le dio, además de para la mayoría de los proveedores no es pre-verificado la dirección de correo electrónico (o no se puede confiar en el proveedor de haber hecho eso) por lo almacenar en la dirección de correo electrónico es una forma segura de robar las identidades de los usuarios.

-1

openid_url no es necesario aquí. Solo el nombre de usuario o nombre (único) funciona para ambas cuentas. También puede crear una tabla separada con openid y userid de la tabla UserAccount.

Cuestiones relacionadas