【问题标题】:How do I authenticate API requests (by anonymous user) in Django rest framework?如何在 Django REST 框架中验证 API 请求(通过匿名用户)?
【发布时间】:2015-08-16 05:25:02
【问题描述】:

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

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

一定有更好更复杂的方法,请帮忙!

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    阅读 authentication 和他们的 tutorial 上的其余 api 文档 - 它们提供了对选项的可靠介绍。

    【讨论】:

    • 谢谢,我确实查看了文档,所有身份验证方案都基于请求来自用户的假设,有没有办法对没有任何用户关联的请求进行身份验证?
    • 鉴于,“身份验证是确认一个人的身份的过程”,我真的不明白您所说的身份验证与身份无关的请求是什么意思?
    【解决方案2】:

    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 来验证特定设备。
    猜你喜欢
    • 2018-05-21
    • 2021-12-11
    • 2020-04-19
    • 2020-05-02
    • 2013-08-22
    • 2021-09-26
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多