没有用户模型的 Django 基于令牌的身份验证

     2023-02-24     128

关键词:

【中文标题】没有用户模型的 Django 基于令牌的身份验证【英文标题】:Django's Token based Authentication without User model 【发布时间】:2017-11-02 00:59:00 【问题描述】:

我正在使用基于 Django 令牌的身份验证。 (JWT Token 由 AWS Cognito 等第三方服务生成,我们只验证签名和过期时间)。

此 REST 应用程序不会有任何用户模型,任何使用 API 调用的人只需通过 JWT 令牌进行身份验证。

class JSONWebTokenAuthentication(TokenAuthentication):
    def authenticate_credentials(self, jwtToken):
        try:
            payload = jwt.decode(jwtToken, secret_key,verify=True)
            # user = User.objects.get(username='root')
            user =  AnonymousUser()
        except (jwt.DecodeError, User.DoesNotExist):
            raise exceptions.AuthenticationFailed('Invalid token')
        except jwt.ExpiredSignatureError:
            raise exceptions.AuthenticationFailed('Token has expired')
        return (user, payload)

在视图中:

@api_view(["POST"])
@authentication_classes((JSONWebTokenAuthentication,))
@permission_classes((AllowAny,))

上述过程根本不跟踪Token。有/无令牌,API 调用正在工作。如果我进行如下两项更改,它就可以工作了。

user = User.objects.get(username='root')
#user = AnonymousUser()
@permission_classes((IsAuthenticated,))

一种方法是,在我的应用程序中至少拥有一个用户并引用该用户[此网络应用程序可能会在需要时扩展到任意数量的实例,因此必须插入具有相同“用户名”的同一用户自动化。 ]。但是,我可以消除身份验证中的“用户”概念吗?

【问题讨论】:

【参考方案1】:

有时您真的不需要用户,例如,服务器到服务器的通信。这是一个解决方案。

覆盖 AnonymousUser 的 is_authenticated 属性,一切顺利

from django.contrib.auth.models import AnonymousUser

class ServerUser(AnonymousUser):

    @property
    def is_authenticated(self):
        # Always return True. This is a way to tell if
        # the user has been authenticated in permissions
        return True

只需在您的自定义身份验证中返回这种新类型的用户

class CustomServerAuthentication(authentication.BaseAuthentication):
    keyword = 'Token'

    def authenticate(self, request):
        auth = get_authorization_header(request).split()

        if not auth or auth[0].lower() != self.keyword.lower().encode():
            return None

        if len(auth) == 1:
            raise exceptions.AuthenticationFailed('Invalid token header. No credentials provided.')

        elif len(auth) > 2:
            raise exceptions.AuthenticationFailed('Invalid token header. Token string should not contain spaces.')

        token = auth[1].decode()

        if not (settings.CUSTOM_SERVER_AUTH_TOKEN == token):
            raise exceptions.AuthenticationFailed('You do not have permission to access this resource')

        user = ServerUser()

        return user, None

【讨论】:

【参考方案2】:

使用django-rest-framework-simplejwt,您可以将DEFAULT_AUTHENTICATION_CLASSES 设置为使用JWTTokenUserAuthentication,即使没有用户也可以验证令牌。

【讨论】:

【参考方案3】:

Django REST 框架在很大程度上假设请求是基于用户进行身份验证的,但它们确实提供了对身份验证匿名请求的支持。但它通过授予匿名用户某些权限而从“验证(django)用户是真实的”的标准假设中脱颖而出。您的第一个案例的问题是“允许任何”的权限装饰器。

我建议有一个虚拟的 Django 用户。 (它也不会阻止您扩展到任意数量的实例)。

使用

user = User.objects.get_or_create(username='whatever')[0]

而不是

user =  AnonymousUser()

现在将权限装饰器更改为

@permission_classes((IsAuthenticated,))

除非您设置密码,否则任何人都无法登录此用户,此外,由于此用户登录不会让您访问您的 API 调用。访问您的 API 的唯一方法是发送一个有效的 Token。

希望这会有所帮助。

【讨论】:

谢谢。它对我来说是一种解决方法。在使用 AWS cognito 等第三方工具时,我相信我们根本不应该关心 Django User 模型。【参考方案4】:

您可以在不向数据库插入数据的情况下使用用户模型 使用:

user = User(id=22,username="someone")

代替:

user = User.objects.get_or_create(username="someone")

 AnonymousUser()

【讨论】:

无法使用用户名/密码登录令牌端点:drf 令牌身份验证和自定义用户模型,Django

】无法使用用户名/密码登录令牌端点:drf令牌身份验证和自定义用户模型,Django【英文标题】:Cannotlogintotokenendpointwithusername/password:drftokenauthandcustomusermodel,Django【发布时间】:2022-01-2213:22:14【问题描述】:我有一个使用Djangorest... 查看详情

使用 PyJWT 基于 Django 令牌的身份验证,令牌验证问题

】使用PyJWT基于Django令牌的身份验证,令牌验证问题【英文标题】:DjangoTokenbasedauthenticationusingPyJWT,issuewithverificationoftoken【发布时间】:2015-10-0723:51:59【问题描述】:我正在PythonDjango中实现基于令牌的身份验证,因此我遵循基于... 查看详情

Django REST 的 JSON Web 令牌不会向用户数据库进行身份验证

...以跨多个服务器进行扩展。我已经研究了几天了,但我还没有找到我的问题的答案。我将djangor 查看详情

在 Django (DRF) 中使用外部 API 进行基于令牌的身份验证

...,如果无效/过期,它将返回401,如果仍然有效,则返回用户信息。基于此,我将返回401或属于用户的过滤数据。此外,PO 查看详情

Django + JSON Web 令牌 + 禁用基于会话的授权

...基于cookie的会话,并将其替换为JSONWeb令牌作为我网站上用户的用户身份验证方式。(“登录的用户身份验证”-req 查看详情

REST API 中基于令牌的身份验证

...用户正在使用移动设备,则令牌将保留在Redis数据库中,没有到期日期。否则,令牌将在20分钟后过期。一旦用户通过身份验证,就会从我的Redis数据库中的每个后续请求中 查看详情

django rest 框架身份验证

...份验证,现在我试图从单独的项目中使用它。我如何使用用户名和密码登录并获取令牌作为响应,并在所有下一个url调用中使用标头中的令牌。在Shell中,我检查了其中一位用户的令牌,并从终端测试了 查看详情

Django Rest 框架中的基于会话的与令牌身份验证

】DjangoRest框架中的基于会话的与令牌身份验证【英文标题】:SessionBasedvsTokenAuthenticationinDjangoRestFramework【发布时间】:2021-05-1023:02:03【问题描述】:DRF文档(https://www.django-rest-framework.org/api-guide/authentication/#authentication)指出令牌身... 查看详情

用户和单独模块的基于令牌的身份验证

】用户和单独模块的基于令牌的身份验证【英文标题】:Tokenbasedauthenticationforuserandseparatemodule【发布时间】:2015-10-1715:56:20【问题描述】:我有2个场景想要实现基于令牌的身份验证:我想在用户登录时实现基于令牌的身份验证... 查看详情

检测用户首次使用 Django Rest Framework 进行身份验证

】检测用户首次使用DjangoRestFramework进行身份验证【英文标题】:DetectfirsttimeuserhasauthenticatedusingDjangoRestFramework【发布时间】:2017-04-1301:28:24【问题描述】:我正在使用DRF来允许我的移动应用程序的用户对我的网络应用程序进行身... 查看详情

使用 otp 获取 api 令牌的 Django REST 框架的 JWT 身份验证

...布时间】:2021-07-0610:11:57【问题描述】:我有一个自定义用户登录,我使用移动OTP验证,并且在我的项目中根本不使用任何django用户模型。需要通过otp对jwtdjangorestframework进 查看详情

基于令牌的身份验证的安全性

...是,在进行身份验证时(可能通过ssl),令牌会被传递给用户,以便即时进行廉价的用户验证。一种实现方式是生成一个cookie,该cookie传递给用户以进行会话管理。但是,我的理解是,基于令牌的身份验证(至少通过cookie)容易... 查看详情

从 Django Rest Framework 中的令牌获取经过身份验证的用户

】从DjangoRestFramework中的令牌获取经过身份验证的用户【英文标题】:GetAuthenticateduserfromtokeninDjangoRestFramework【发布时间】:2014-06-0718:28:02【问题描述】:我是Django的新手,我已经设法使用DRF构建了一个小型API。我有我的angular.js... 查看详情

Web API 中基于令牌的身份验证,无需任何用户界面

】WebAPI中基于令牌的身份验证,无需任何用户界面【英文标题】:TokenbasedauthenticationinWebAPIwithoutanyuserinterface【发布时间】:2016-12-0407:19:27【问题描述】:我正在用ASP.NetWebAPI开发一个RESTAPI。我的API只能通过非基于浏览器的客户端... 查看详情

为啥在使用 ASP.NET Core Identity 和基于令牌的身份验证时登录新用户?

...1:14【问题描述】:我正在使用带有标识和JWT的ASP.NETCore。没有太多关于 查看详情

基于 Spring Security 令牌的身份验证

...ringsecurity基本授权进行身份验证,客户端为每个请求发送用户名和密码。现在,我想实现基于令牌的身份验证,当用户首先通过身份验证时,我将在响应标头中发送一个令牌。对于进一步的请求,客户端可以 查看详情

如何使用基于令牌的身份验证对在浏览器中输入 url 的用户进行身份验证?

】如何使用基于令牌的身份验证对在浏览器中输入url的用户进行身份验证?【英文标题】:howtoauthenticateuserswhomauallyentertheurlinbrowserusingthetokenbasedauthentication?【发布时间】:2016-10-0219:39:43【问题描述】:我正在通过传递jwt令牌使... 查看详情

Django 通道 JWT 身份验证

...2513:44:23【问题描述】:我正在尝试访问Consumer.py范围内的用户,并从数据库中获取一些与用户相关的模型。但是,我用于验证所有websocket连接的AuthMiddlewareStack似乎无法正常工作。当我在我的REST框架中使用JWT令牌django-rest-framework 查看详情