Подтвердить что ты не робот

Лучший способ поддержки множественного входа в AppEngine

Я рефакторинг для клиента приложения, которое должно поддерживать 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 в прошлом, поэтому я знаю, как справляться с ними, проблема заключается в их объединении. К сожалению, переход на другую инфраструктуру - это не вариант.

4b9b3361

Ответ 1

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

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 и т.д.).

Ответ 2

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

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

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

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