2

在客户端,我使用 Facebook 的 iOS SDK 登录并获得 Facebook ID 和访问令牌。

现在在 Django 方面,我想创建一个用户,使用 Facebook ID 作为主要标识符和其他字段,如访问令牌、名字、姓氏等(我将从服务器上的 Graph API 中检索最后两个字段边)。

我知道我必须创建一个自定义用户模型。

如果您希望存储与用户相关的信息,您可以使用与包含附加信息字段的模型的一对一关系。这种一对一的模型通常称为配置文件模型,因为它可能存储有关站点用户的非身份验证相关信息。

这还不够,因为我将使用 Facebook ID 和访问令牌进行身份验证。

这给我留下了两个选择:我可以像这样替换自定义用户模型:

AUTH_USER_MODEL = 'myapp.MyUser'

或者我可以继承 AbstractUser:

如果您对 Django 的 User 模型完全满意并且只想添加一些额外的配置文件信息,您可以简单地继承 django.contrib.auth.models.AbstractUser 并添加您的自定义配置文件字段。

但这听起来也不完全正确。这个设计技巧也让我更加困惑。

模型设计注意事项 在处理与自定义用户模型中的身份验证不直接相关的信息之前,请仔细考虑。将特定于应用程序的用户信息存储在与用户模型有关系的模型中可能会更好。

实现我正在尝试做的事情的最佳方法是什么?

4

2 回答 2

1

附带说明:自定义用户的问题是,由于其他应用程序(是的,您将使用它们)由于他们对身份验证的基本模型所做的假设而经常无法与它正确交互。

这还不够,因为我将使用 Facebook ID 和访问令牌进行身份验证。

我不确定您是否真的需要自定义用户。例如,我使用open id进行身份验证,使用默认用户没有问题:只有另一个模型与默认用户具有 OneToOne 关系。

对于 Facebook ID 进行身份验证(以及一般的身份验证),您应该关注的主要问题是拥有一个自定义身份验证后端及其自己的特定 facebook 身份验证。

在内部,authenticate()运行所有已安装的后端 ( settings.AUTHENTICATION_BACKENDS) 并尝试使用其中之一对用户进行身份验证。

您可以搜索一些现有的实现,例如在Django 包中进行 facebook 身份验证

于 2013-08-27T06:51:02.737 回答
0

如果您的用户应该能够使用用户名、邮件和密码登录/注册 -> 使用OneToOne与 django 的用户模型的关系来存储 facebook 凭据。

如果您的用户模型完全依赖于 Facebook 数据,并且您不希望您的用户使用用户名/密码登录 -> 将用户模型替换为AUTH_USER_MODEL = 'myapp.MyUser'.

您可能还想看看django-allauth,它在一个可爱的小包中解决了您的大部分问题。

于 2013-08-27T06:50:31.363 回答