繁体   English   中英

如何在Django rest框架中验证API请求(由匿名用户)?

[英]How do I authenticate API requests (by anonymous user) in Django rest framework?

API请求将由匿名用户发送。 没有登录/注册功能。

我需要验证API请求,我尝试过的一种原始方法是在每个请求中发送一个auth密钥。 这个auth键,我作为常量保存在Angular前端。

必须有一个更好,更复杂的方式,请帮助!

Django REST框架主要假设请求是基于用户进行身份验证的,但它们确实为身份验证匿名请求提供支持。 虽然这在很大程度上打破了“身份验证”意味着“验证(Django)用户是真的”的假设,但Django REST框架确实允许它发生,而只是替代AnonymousUser

DRF中的身份验证可以在request.user定义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

阅读有关身份验证及其教程的其他api文档 - 它们为选项提供了可靠的介绍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM