我已经阅读了很多关于 django-piston 的文章,并使用它为我正在开发的应用程序制作 API,但我对世界的客户端很着迷。我已经编写了处理程序和 uri 映射,并且可以随心所欲地返回 JSON 或 XML。我陷入困境的是现在该怎么办。
我理想的结局是让 iPhone 和 Android 客户端消费并返回数据,但我不知道处理身份验证的正确方法。我能想到的最简单的方法是将用户名和密码保存在设备上,并用它标记每个请求,最终使用基本身份验证,但这会造成错误。我研究了活塞对 OAuth 的支持,并在以下人员的帮助下使其正常工作本教程 http://blog.carduner.net/2010/01/26/django-piston-and-oauth/,但这也不是正确的答案。最终,我真的很想在设备上有一个简单的用户名和密码提示,这些将通过 Piston 和 REST 发送到 Django,并且 API 密钥将返回。设备将存储该密钥并用它标记所有后续请求。这感觉是正确的方法,但我不知道该怎么做。有人能指出我正确的方向吗?
您可以编写自己的身份验证模块。这是一个例子:
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
您需要一个模型来存储 API 密钥到用户的映射:
class ApiKey(models.Model):
user = models.ForeignKey(User, related_name='keys')
key = models.CharField(max_length=KEY_SIZE)
您需要某种方法来生成实际的密钥。像这样的东西会起作用(例如,在 ApiKey 模型中save
method:
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)
最后,连接新的身份验证后端:
# urls.py
key_auth = ApiKeyAuthentication()
def ProtectedResource(handler):
return resource.Resource(handler=handler, authentication=key_auth)
your_handler = ProtectedResource(YourHandler)
至于将用户名/密码交换为 API 密钥,只需编写一个处理程序,使用 BasicAuthentication 创建并返回新的 ApiKey(用于 request.user)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)