我正在设计一个网站,人们将在其中以用户身份登录,并可能在多个组中,这些组有几种不同的类型。我既想拥有一个人们可以直接使用的网站,又想公开一个可供其他网站使用的 API。
什么是实现登录系统的最佳方法,该系统既适用于网站本身的普通用户,又允许使用 API 的网站代表用户无缝创建帐户并允许用户从我的网站查看他们的数据网站和使用 API 的网站?
我使用的是 Django 1.5,所以我愿意自定义用户模型等等。 API 将使用 Tastypie 提供。
编辑 : 老实说,我的主要问题是我并不真正了解 API key 何时有用以及它们如何与常规用户登录共存(如果有的话)。
最佳答案
用例:
API key 的第一个和用例是自动化。您提供您的api key
(或通常称为 token
)到 第三方瞧,你可以让第 3 方为你做事。当您不再信任第 3 方时,您可以撤销 api key
或重新生成它。 Api key 允许用户通过传统身份验证(例如 username/password
)请求 token 来启动和验证操作链,然后用户将其传递给相关方。最后看我关于电话号码的小故事。
为什么不使用密码?
因为您不想在其他网站上危害您的用户并让他们在那里输入密码以使用您的 API。如果第 3 方受到威胁,则用户的通信或密码受到威胁。
这里有很好的资源:
带有 Tastypie 的 Api 键
这是 good starting point :
from django.contrib.auth.models import User
from django.db import models
from tastypie.models import create_api_key
models.signals.post_save.connect(create_api_key, sender=User)
由于
post_save
,这应该负责创建 api key 。信号。第二部分是允许多个身份验证方案适合您的用例,所以...到 MultiAuthentication
:from django.contrib.auth.models import User
from tastypie.authentication import BasicAuthentication, ApiKeyAuthentication, MultiAuthentication
from tastypie.authorization import DjangoAuthorization
from tastypie.resources import ModelResource
class UserResource(ModelResource):
class Meta:
queryset = User.objects.all()
resource_name = 'auth/user'
excludes = ['email', 'password', 'is_superuser']
authentication = MultiAuthentication(BasicAuthentication(), ApiKeyAuthentication())
authorization = DjangoAuthorization()
其他注意事项
这些是永远不会在网络上泄露敏感数据的好习惯:
ssl
的情况下进行任何用户/密码验证或 tls
. ssl
的情况下使用 http 基本身份验证或 tls
. permissions
锁定用户不应访问的资源. cache-control
标题 我使用 gmail 所以这里是一个来自 https://security.google.com/settings/security 的例子(查看权限)我可以看到如何使用 google openid:
为什么要为每个第 3 方使用一个 api key ? 与 相同为什么要允许用户拥有多个 api key 并将它们标记为特定用途? .
答案是,如果
api key
是您分享的内容,就像您的 phone number
,但您不需要向所有 friend 提供相同的电话号码(谷歌语音 FTW!)。如果您的 friend 行为不端并将其交给一群销售代表,您会非常生气。如果您的手机是相同的,那么拥有它的人可能会在您不知情的情况下与其他人共享它。最终结果,所有销售代表都知道你的号码……不太好。但你还是希望你妈妈能调用你,对吧?所以你不能真正改变你的号码。现在想象一个更危险的情况;你在本地的比萨店有一个标签,他们知道你的名字/电话号码。如果有人获得了您的 api key ,他们可能会冒充您订购披萨并仍然向您收费(您有一个标签!)。
如果你有 100 个号码给 100 个不同的 friend ,他们不仅可以联系你,而且如果销售代表用某个特定号码给你打电话,你就会知道你的哪个 friend 把它给了,你可以删掉那个号码.妈妈现在很高兴,因为她可以告诉你去哪里吃早午餐。您的 friend 现在决定点比萨……您现在可以追踪到您的 friend (或者您应该向比萨店提供一个您的 friend 都不知道的号码)。
关于django-tastypie : why are api keys useful and how to support multiple auth schemes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17508912/