【发布时间】:2015-08-16 05:25:02
【问题描述】:
API 请求将由匿名用户发送。没有登录/注册功能。
我需要对 API 请求进行身份验证,我尝试的一种原始方法是在每个请求中发送一个身份验证密钥。这个身份验证密钥,我作为常量保存在 Angular 前端。
一定有更好更复杂的方法,请帮忙!
【问题讨论】:
标签: django django-rest-framework
API 请求将由匿名用户发送。没有登录/注册功能。
我需要对 API 请求进行身份验证,我尝试的一种原始方法是在每个请求中发送一个身份验证密钥。这个身份验证密钥,我作为常量保存在 Angular 前端。
一定有更好更复杂的方法,请帮忙!
【问题讨论】:
标签: django django-rest-framework
阅读 authentication 和他们的 tutorial 上的其余 api 文档 - 它们提供了对选项的可靠介绍。
【讨论】:
Django REST 框架在很大程度上假设请求是基于用户进行身份验证的,但它们确实提供了对身份验证匿名请求的支持。虽然这在很大程度上打破了“身份验证”意味着“验证(Django)用户是真实的”的假设,但 Django REST 框架确实允许它发生并且只是替换了AnonymousUser。
DRF 中的身份验证可以在请求中定义request.user(经过身份验证的用户)和request.auth(通常是使用的令牌,如果适用)属性。因此,对于您的身份验证,您将保留已创建的令牌(在模型或其他地方),并且这些令牌将被验证而不是用户凭据,并且您最终不会设置用户。
from django.contrib.auth.models import AnonymousUser
from rest_framework import authentication
from rest_framework import exceptions
class ExampleAuthentication(authentication.BaseAuthentication):
def authenticate(self, request):
auth = authentication.get_authorization_header(request)
if not auth or auth[0].lower() != b'token':
return None
if len(auth) == 1:
msg = _('Invalid token header. No credentials provided.')
raise exceptions.AuthenticationFailed(msg)
elif len(auth) > 2:
msg = _('Invalid token header. Credentials string should not contain spaces.')
raise exceptions.AuthenticationFailed(msg)
try:
token = Token.objects.get(token=auth[1])
except Token.DoesNotExist:
raise exceptions.AuthenticationFailed('No such token')
return (AnonymousUser(), token)
此示例假设您有一个 Token 模型,该模型存储将要进行身份验证的令牌。如果请求通过正确的身份验证,令牌对象将设置为 request.auth。
【讨论】:
None,则AnonymousUser 将是应用于请求的默认用户;如果您使用IsAuthenticated 权限,匿名用户将不会通过身份验证。请注意,this question 使用自定义 AnonymousUser 来验证特定设备。