edd*_*ger 8 api django rest django-piston
我一直在阅读django-piston上的很多东西并且用来为我正在开发的应用程序制作一个API,但是我在世界的客户端被挂了.我编写了处理程序和uri映射,我可以将JSON或XML归还给我的内容.我陷入困境的地方现在该怎么办.
我理想的最终目标是让iPhone和Android客户端使用和返回数据,但我不知道处理身份验证的正确方法.我能想到的最简单的方法是在设备上保存用户名和密码,并用它标记每个请求,最终使用基本身份验证,但这样做有些错误.我已经研究了活塞对OAuth的支持,并在本教程的帮助下使其工作,但这也不是正确的答案.最后,我真的希望在设备上有一个简单的提示输入用户名和密码,这些将通过Piston和REST发送到Django,并且API密钥将返回.设备将存储该密钥并用它标记所有后续请求.这感觉是正确的方式,但我无法弄清楚如何做到这一点.任何人都可以指出我正确的方向吗?
Chr*_*lor 22
您可以编写自己的身份验证模块.这是一个例子:
class ApiKeyAuthentication(object):
def is_authenticated(self, request):
auth_string = request.META.get("HTTP_AUTHORIZATION")
if not auth_string:
return False
key = get_object_or_None(ApiKey, key=auth_string)
if not key:
request.user = AnonymousUser()
return False
request.user = key.user
return True
def challenge(self):
resp = HttpResponse("Authorization Required")
resp['WWW-Authenticate'] = "Key Based Authentication"
resp.status_code = 401
return resp
Run Code Online (Sandbox Code Playgroud)
您需要一个模型来存储API密钥到用户的映射:
class ApiKey(models.Model):
user = models.ForeignKey(User, related_name='keys')
key = models.CharField(max_length=KEY_SIZE)
Run Code Online (Sandbox Code Playgroud)
你需要一些方法来生成实际的密钥.像这样的东西会起作用(例如,在ApiKey模型的save
方法中:
key = User.objects.make_random_password(length=KEY_SIZE)
while ApiKey.objects.filter(key__exact=key).count():
key = User.objects.make_random_password(length=KEY_SIZE)
Run Code Online (Sandbox Code Playgroud)
最后,连接新的身份验证后端:
# urls.py
key_auth = ApiKeyAuthentication()
def ProtectedResource(handler):
return resource.Resource(handler=handler, authentication=key_auth)
your_handler = ProtectedResource(YourHandler)
Run Code Online (Sandbox Code Playgroud)
至于交换API密钥的用户名/密码,只需编写一个使用BasicAuthentication创建并返回新ApiKey(对于request.user)的处理程序.
归档时间: |
|
查看次数: |
2231 次 |
最近记录: |