2010-11-17 11 views
11

Sto refactoring per un client un'app che dovrebbe supportare OpenID, Facebook Connect e autenticazione personalizzata (email + password). crediate che io sia:Il modo migliore per supportare l'accesso multiplo su AppEngine

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

Stavo pensando di implementare diversi sistemi di autenticazione in questo modo:

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() 

C'è una soluzione migliore? C'è già una risposta here ma non riesco a capire se questa è la soluzione giusta per me. Ho già sviluppato un'app utilizzando l'API Users e un'altra utilizzando Facebook Connect in passato, quindi so come gestire entrambi, il problema è collegarli insieme. Passare a un altro framework non è un'opzione, purtroppo.

+3

Facebook ora utilizza una versione bozza di OAuth 2.0, che dipende da https per sicurezza. Attenzione: il servizio URL Fetcher di App Engine attualmente non convalida i certificati https, il che significa che la tua app sarà vulnerabile agli attacchi di avvelenamento DNS e man-in-the-middle; esponendo potenzialmente le tue chiavi segrete di Facebook. Dovrai decidere autonomamente se pensi che qualcuno possa montare con successo un simile attacco sulle macchine Fetcher di URL di Google e se una tale perdita di chiavi segrete sia accettabile. –

+0

Questo è sulla mia tabella di marcia in un paio di mesi, quindi apprezzerei anche una risposta. – mjhm

+0

@Fest. Grazie per il testa a testa. Se capisco correttamente la potenziale minaccia di cui parli si trova tra i server GAE e i server di Facebook. Questa non è una minaccia "Starbucks WiFi" a livello utente. È corretto? – mjhm

risposta

1

Prima ho usato qualcosa come:

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

e:

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

E 'buono e di ricerca è veloce, ma manca il supporto per il login multi-fornitore (vale a dire l'utente vuole essere in grado di accedere utilizzando sia Google e Facebook).

Questa è la mia soluzione attuale:.

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

Lookup è più lento, ma è fatto solo una volta su login, dopo di che negozio ho user.key() id() in sessione e usare quella. È anche utile perché puoi collegare l'utente a una combinazione di email/password. Il rovescio della medaglia è che devi forzare l'unicità manualmente sulle tue chiavi (email, ID facebook, id google ecc ...).

2

Vorrei dare un'occhiata da vicino a tipfy e il suo Authentication extension. *

Essi hanno implementato un Universal User model che può essere utilizzato con le API di utenti predefinito di App Engine, propri metodi di autenticazione partito AUT o terzi (OpenID, OAuth, ecc).

Here è la documentazione, cercare la sezione MultiAuthMixin.

* i buoni programmatori scrivono un buon codice; grandi programmatori rubano grande codice

+0

Già fatto, purtroppo l'integrazione di ciò nella webapp è un problema, spero davvero che Webapp sia migliorata per implementarlo. – Spear

Problemi correlati