2010-09-13 14 views
0

Nous avons un projet Django qui fonctionne sur Google App Engine et utilisé db.UserProperty dans plusieurs modèles. Nous n'avons pas de propre modèle d'utilisateur.db.UserProperty de Google App Engine avec rpxnow

Mon patron aimerait utiliser RPXNow (Janrain) pour l'authentification, mais après l'avoir intégré, la méthode users.get_current_user() a retourné None. Cela a du sens, car Google ne m'a pas authentifié. Mais que dois-je utiliser pour les attributs db.UserProperty? Est-il possible d'utiliser rpxnow et peut toujours avoir l'objet User de Google? Après cela, j'ai essayé d'utiliser l'authentification OpenID (avec connexion fédérée) dans mon application, et ça marche plutôt bien: j'ai toujours l'objet users.get_current_user(). Pour autant que je sache, rpxnow utilise aussi openID, ce qui signifie (pour moi) qu'il devrait être possible d'obtenir des objets User avec rpxnow. Mais comment?

Cheers, Psmith

Répondre

1

Vous ne pouvez obtenir un objet utilisateur si vous utilisez l'une des méthodes d'authentification intégrées. Les objets utilisateur fournissent une interface à l'API Users, gérée par l'infrastructure App Engine. Si vous utilisez votre propre bibliothèque d'authentification, quel que soit le protocole utilisé, vous devrez stocker les informations utilisateur différemment.

+0

J'espère que c'est possible, mais merci pour la réponse. – psmith

3

Je ne l'ai pas encore essayé, mais App Engine prend désormais en charge la connexion fédérée (OpenID) en tant que mécanisme d'authentification. Vous pouvez l'activer depuis votre tableau de bord.

En savoir plus ici: http://code.google.com/googleapps/domain/sso/openid_reference_implementation.html

Indépendamment de cela, il est très facile -once que vous avez intégré RPXNow- pour le lier à votre application à l'aide du PolyModel, comme suit:

class InternalUser(polymodel.PolyModel): 
    name = db.StringProperty(required=True) 
    groups = db.ListProperty(db.Key) 

class GoogleUser(InternalUser): 
    google_user = db.UserProperty(required=True) 

class OpenIDUser(InternalUser): 
    unique_identifier = db.StringProperty(required=True) 

Et puis Au lieu d'utiliser db.UserProperty vous utiliseriez db.ReferenceProperty(required=True, reference_class=InternalUser).

+0

Merci pour votre réponse. La base de données actuelle contient des attributs 'db.UserProperty' donc la migration ne serait pas facile. Donc, j'utilise la connexion fédérée pour l'instant, peut-être que Google offrira une meilleure solution plus tard :) – psmith