Лучший способ поддержки множественного входа в AppEngine - PullRequest
11 голосов
/ 17 ноября 2010

Я выполняю рефакторинг для клиента приложения, которое должно поддерживать OpenID, Facebook Connect и пользовательскую аутентификацию (электронная почта + пароль). Предположим, что у меня есть:

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

Я думал о реализации различных систем аутентификации следующим образом:

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

Есть ли лучшее решение? Здесь уже есть ответ здесь , но я не могу понять, является ли это правильным решением для меня. Я уже разработал приложение с использованием API пользователей, а другое - с помощью Facebook Connect, поэтому я знаю, как справиться с обоими, проблема в том, чтобы соединить их вместе. К сожалению, переход на другую платформу невозможен.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Я бы внимательно посмотрел на tipfy и его расширение аутентификации . *

Они реализовали Универсальный пользовательмодель , которая может использоваться с API-интерфейсом по умолчанию для App Engine, методами собственной аутентификации или сторонней аутентификации (OpenId, OAuth и т. д.).

Здесь - документация, ищите MultiAuthMixin раздел.

* хорошие программисты пишут хороший код;великие программисты воруют отличный код

1 голос
/ 30 ноября 2010

Сначала я использовал что-то вроде:

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

и

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

Это хорошо, и поиск быстрый, но в нем отсутствует поддержка входа в систему от нескольких провайдеров (т.е. пользователь хочет иметь возможность войти в систему, используя как Google, так и Facebook).

Это моё настоящее решение:

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

Поиск выполняется медленнее, но выполняется только один раз при входе в систему, после чего я сохраняю user.key (). Id () в сеансе и использую его. Это также хорошо, потому что вы можете связать пользователя с комбо электронной почты / пароля. Недостатком является то, что вы должны принудительно вводить уникальность для своих ключей (адрес электронной почты, идентификатор Facebook, идентификатор Google и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...