django-tastypie:为什么api密钥有用以及如何支持多个auth方案?

Pla*_*ure 6 api django django-authentication tastypie

我正在设计一个网站,其中人们将以用户身份登录,并且可能分为多个组,这些组有几种不同的类型.我想要一个人们可以直接使用的网站,以及公开可以被其他网站使用的API.

实现登录系统的最佳方式是什么,该登录系统既适用于网站本身的常规用户,也允许API消费网站代表用户无缝创建帐户,并允许用户查看我的数据网站和API消费网站?

我正在使用Django 1.5,所以我愿意自定义用户模型和所有这些.API将使用Tastypie提供.

编辑:老实说,我的主要问题是我不太了解API密钥何时有用以及它们如何与常规用户登录共存(如果有).

dno*_*zay 11

使用案例:

API密钥的第一个和用例是自动化.您提供api key(或通常称为token)第三方,瞧,您可以让第三方为您做的事情.当您不再信任第三方时,您可以撤消api key或重新生成它.Api密钥允许用户通过传统认证(例如username/password)请求令牌来启动和认证动作链,然后用户将其传递给感兴趣的各方.最后看看我关于电话号码的小故事.

为什么不使用密码?

因为您不想在其他网站上危害您的用户,并让他们在那里键入密码以便使用您的API.如果第三方遭到入侵,则用户的通信或密码将受到损害.

这是很好的资源:


Api键与tastypie

这是一个很好的起点:

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)
Run Code Online (Sandbox Code Playgroud)

由于post_save信号,这应该照顾创建api键.第二部分是允许多个身份验证方案适合您的用例,所以......上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()
Run Code Online (Sandbox Code Playgroud)

其他考虑

这些是从不泄漏网络上的敏感数据的好习惯:

  • 没有不做任何用户名/密码认证ssltls.
  • 不使用ssl或不使用http基本身份验证tls.
  • 锁定用户不应访问的资源permissions.
  • 确保您的回复cache-control标题正确
  • 始终允许用户重置/重新生成/删除其令牌/ api密钥.
  • 用户不需要只有一个api密钥,你可以拥有其中几个; 每个第三方一个.

我使用gmail,所以这里有一个来自https://security.google.com/settings/security(审核权限)的示例,我可以看到如何使用google openid:

撤消谷歌openid的权限

为什么要为每个第三方使用一个api密钥?是否应该允许用户拥有多个api密钥并将其标记为特定用途?.

答案是,如果api key您分享的内容与您的相同phone number,但您不需要向所有朋友提供相同的电话号码(谷歌语音FTW!).

  • 案例1:一个电话号码.

如果你的朋友行为不端并把它交给了一大堆销售代表,你会非常生气.如果您的手机是相同的,那么拥有它的人可能会在不知情的情况下与其他人分享.最终结果,所有销售代表都知道你的号码...不太好.但你仍然希望你妈妈能打电话给你,对吗?所以你不能真正改变你的号码.现在想象一个更危险的情况; 你在当地比萨店有一个标签,他们通过姓名/电话号码了解你.如果有人拿到你的api密钥,他们可能冒充你订购披萨并仍然向你收费(你有一个标签!).

  • 案例2:多个电话号码:

如果您有100个号码给100个不同的朋友,他们不仅可以与您联系,而且如果销售代表给您打电话给您,您会知道您的哪位朋友给了它,您可以只删一个号码.妈妈现在开心了,因为她可以告诉你去哪儿吃早午餐.你的朋友现在决定订购披萨......你现在可以追踪到你的朋友(或者你应该给比萨店提供一个你朋友都不知道的数字).