2010-11-17 14 views
11

Estoy refactorizando para un cliente una aplicación que debe admitir OpenID, Facebook Connect y autenticación personalizada (correo electrónico + contraseña). Supongamos que tengo:La mejor manera de admitir el inicio de sesión múltiple en App Engine

class MyUser(db.Model): 
    pass 
class Item(db.Model): 
    owner = db.ReferenceProperty(MyUser) 

Estaba pensando implementar diferentes sistemas de autenticación de esta manera:

class OpenIDLogin(db.Model): # key_name is User.federated_identity()? User.user_id()? 
    user = db.ReferenceProperty(MyUser) 

class FacebookLogin(db.Model): # key_name is Facebook uid 
    user = db.ReferenceProperty(MyUser) 

class CustomLogin(db.Model): # key_name is the user email 
    user = db.ReferenceProperty(MyUser) 
    password = db.StringProperty() 

¿Hay una solución mejor? Ya hay una respuesta here pero no puedo entender si esa es la solución correcta para mí. Ya he desarrollado una aplicación usando la API de usuarios y otra que usa Facebook Connect en el pasado, así que sé cómo manejar ambas, el problema es unirlas. Cambiar a otro marco no es una opción lamentablemente.

+3

Facebook ahora usa una versión preliminar de OAuth 2.0, que depende de https para mayor seguridad. Cuidado: el servicio de obtención de URL de App Engine actualmente no valida los certificados https, lo que significa que su aplicación será vulnerable a los ataques de envenenamiento de DNS y de "hombre en el medio"; potencialmente exponiendo tus claves secretas de Facebook. Tendrás que decidir por ti mismo si crees que alguien podría montar tal ataque en las máquinas de captación de URL de Google y si esa fuga de clave secreta es aceptable. –

+0

Esto está en mi hoja de ruta en un par de meses, así que agradecería una respuesta también. – mjhm

+0

@Forest. Gracias por el aviso. Si entiendo correctamente, la amenaza potencial de la que está hablando se encuentra entre los servidores de GAE y los servidores de Facebook. Esta no es una amenaza "Starbucks WiFi" de nivel de usuario. ¿Es eso correcto? – mjhm

Respuesta

1

Primera i usa algo como:

key_name = '%s|%s' % ('facebook', facebook_uid) 

y:

key_name = '%s|%s' % ('myapp', email) 

Es bueno y las operaciones de búsqueda es rápido, pero carece de apoyo para el acceso multi-proveedor (es decir, el usuario quiere poder iniciar sesión usando tanto google como facebook).

Ésta es mi solución real:.

class User(db.Model): 
    accounts = StringListProperty() # ['facebook|1234', 'google|4321'] 
    email = StringProperty() 
    password = StringProperty() 

de búsqueda es más lento, pero se hace una sola vez en el inicio de sesión, después de que la tienda que user.key() id() en sesión y usar eso. También es bueno porque puede vincular al usuario a un combo de correo electrónico/contraseña. El inconveniente es que debe aplicar la singularidad de forma manual en sus claves (correo electrónico, ID de Facebook, ID de Google, etc.).

2

Me gustaría echar un vistazo a tipfy y su Authentication extension. *

Han implementado un Universal User model que se puede utilizar con los usuarios por defecto API de App Engine, propios métodos de autenticación partido de autenticación o de terceros (OpenID, OAuth, etc).

Here es la documentación, busque sección MultiAuthMixin.

* buenos programadores escriben un buen código; grandes programadores roban gran código

+0

Ya lo hice, desafortunadamente integrar eso en webapp es un dolor, realmente espero que webapp-improved lo implemente. – Spear

Cuestiones relacionadas