Django Rest Framework 请求对AllowAny 设置进行身份验证

2023-11-22

我创建了一个JWT-授权应用程序的后端。登录、注销、令牌检索和刷新都工作正常,符合预期。今天早上我添加了一个注册视图,它抛出了通常的情况"detail": "Authentication credentials were not provided.对于未经身份验证的请求,您可能会遇到错误,因为这是默认情况(见下文)。

但是,因为这是一个注册端点,我不希望它只允许授权的请求。 (检查了有效令牌后,当您提供身份验证时,视图的其余部分将按预期工作。)查看DRF docs,我认为使用带有AllowAny的permission_classes包装器在这里可以工作,但事实并非如此。

我缺少什么?我觉得 Permission_classes 装饰器应该覆盖“IsAuthenticated”的默认设置?

我正在从curl 在本地主机上进行测试:

curl -X POST -H "Content-Type: application/json" -d '{"email":"[email protected]", "first_name": "boba", "last_name": "fett" "password":"xyz"}' http://localhost:8000/account/register/

视图是:

@permission_classes(AllowAny)
@api_view(['POST'])
def register_user(request):
    from django.contrib.auth.models import User
    from rest_framework_jwt.views import obtain_jwt_token
    if request.user.is_authenticated():
        return Response ({"already_registered": "User with that username has already registered"}, status=status.HTTP_701_ALREADY_REGISTERED)
    data = request.data

    user, created = User.objects.get_or_create(username=data["email"],
                                               email=data["email"],
                                               first_name=data["first_name"],
                                               last_name=data["last_name"],
                                               password=data["password"])
    if created:
        token = obtain_jwt_token(data["email"],data["password"] )
        return Response ({"token": token}, status=status.HTTP_200_OK)
    else:
        return Response ({"already_registered": "User with that username has already registered"}, status=status.HTTP_701_ALREADY_REGISTERED)

settings.py 中的权限是:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
}

相关问题:Django Rest Framework - 未提供身份验证凭据- 我认为默认权限是正确的,我只想在这种情况下覆盖它们。

Django Rest Framework - 由于 CSRF 令牌不正确而导致 DELETE ajax 调用失败- CSRF 未用作基于 JWT 的身份验证。

Django:Rest Framework 验证标头- Apache 特定问题(当前仍在 devserver localhost 上)

未提供 Django Rest Framework 身份验证凭据- 还没有回答!


装饰器的顺序很重要。您的代码也存在一些问题。

我建议使用序列化器,也许像下面这样。如果您想使用电子邮件作为用户名,我会制作一个自定义用户模型。 Django 的默认身份验证系统的用户名字段的 max_length 为 30,而人们的电子邮件地址很容易超过该长度。

class UserSerializer(serializers.ModelSerializer):
    first_name = serializers.CharField(required=False, allow_null=True)
    last_name = serializers.CharField(required=False, allow_null=True)
    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'email', 'password')

    def create(self, validated_data):
        return User.objects.create_user(**validated_data)

@api_view(['POST'])
@permission_classes([permissions.AllowAny,])
def register_user(request):
    if request.user.is_authenticated():
        return Response({"already_registered": "User with that username has already registered"}, status=701)
    data = request.data
    serializer = UserSerializer(data=data, partial=True)
    if serializer.is_valid():
        serializer.save(username=serializer.validated_data['email'])
        token = #call the url to get your tokens, use urllib or something similar
        return Response({"token": token}, status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Edit装饰器的顺序如下:

@decorator
@decorator2
def func():
    print('hello world')

与装饰器相同(decorator2(func)))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Rest Framework 请求对AllowAny 设置进行身份验证 的相关文章

  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web
  • 跨子域的 PHP 会话

    我正在尝试设置以下内容 auth example com sub1 example com sub2 example com 如果用户访问sub1 example com or sub2 example com他们没有登录 他们被重定向到a
  • Next.js 身份验证策略

    我一直在尝试为 Next js 项目实现可靠的身份验证流程 但现在我完全迷失了 我已经看过 Next js 的示例存储库 但我对完整的解决方案有很多疑问 我有一个express js API 和一个单独的Next js 前端项目 所有数据和
  • 装修工合同

    合同 以函数作为参数并返回函数的函数 即传递函数的修改 或相同 版本 传递的函数 这里是 square 例如 floatify def square n return n n 装饰器是否应该只返回传递函数的装饰版本 而不返回其他内容 它应该
  • 设计路由错误

    设置设备时我似乎无法克服此错误 Routing Error wrong constant name Devise registrationsController or Routing Error wrong constant name De
  • MVC3:一个控制器是否需要 Windows 身份验证,而第二个控制器允许匿名?

    我有一个控制器 用于在需要 Windows 身份验证的内部 Web 应用程序中呈现页面 是否存在第二个控制器 用于对系统进行基于 JSON 的查询 不需要进行 Windows 身份验证 那可能吗 看来我目前只能做其中之一 有什么建议么 我们
  • 启动包中没有指定postgresql用户名

    public class HelloPostgreSQLActivity extends Activity TextView resultArea Override public void onCreate Bundle savedInst
  • Python:kwargs.pop() 和 kwargs.get() 之间的区别

    我已经看到了这两种方法 但我不明白有什么区别以及我应该使用什么作为 最佳实践 def custom function kwargs foo kwargs pop foo bar kwargs pop bar def custom funct
  • Symfony 4 应用程序可与 Docker Compose 配合使用,但无法与 Docker Swarm 配合使用(无法登录,分析器损坏)

    我在用着Docker 组合本地 app容器 Nginx PHP FPM with a 交响乐4 app PostgreSQL容器 Redis容器 它在本地运行良好 但部署到开发中时效果很好码头工人群集群 我无法登录 Symfony 应用程序
  • 使用字符串变量 **kwargs 作为命名参数

    我正在尝试找出一种方法来循环 json 配置文件并使用键名称作为使用 kwargs 的方法的参数名称 我创建了一个 json 配置文件并使用键名作为方法 我只需将 set 附加到键名称即可调用正确的方法 我将 json 转换为字典以循环遍历
  • 从 Python 执行 PowerShell 脚本的最佳方式是什么

    之前关于该主题的所有帖子都涉及其用例的具体挑战 我认为 如果有一篇文章只讨论从 Python 运行 PowerShell 脚本的最简洁方法 并询问是否有人有比我发现的更好的解决方案 那将会很有用 绕过 PowerShell 尝试以与预期不同
  • ValueError:张量必须与张量来自同一个图

    我正在尝试在张量流中构建图表 但遇到以下错误 ValueError 张量 transformation 0 输出 输出 0 形状 dtype float32 必须来自同一个图表 张量 变量 总输出 0 形状 dtype float32 re
  • 如何使用 phantomjs 使用文件中的持久 cookie

    我需要一些身份验证才能访问特定的网址 在浏览器中我只需要登录一次 至于其他可以使用cookie中的会话id的相关url不需要转到登录页面 同样 我可以使用 cookie 文件中生成的 cookie cookies file cookies
  • 找出用户属于哪些组

    我有一个刚刚创建的 Windows 用户帐户 以 XYZ 为例 此 XYZ 属于我在计算机管理 gt 本地用户和组中创建的用户组和自定义组 因此 在属性中我看到该用户属于 2 个组 现在我想获取这些组并显示它们 有什么建议么 我已经这样做了
  • 从 Google/Facebook 帐户重新验证用户身份

    因此 我需要创建一个 REST API 来为 IOS 应用程序提供功能 我们允许用户仅使用普通帐户或使用脸书 谷歌登录 我最近一直在阅读 OAuth 我想我了解在我的情况下如何使用 OAuth 的过程 当用户使用脸书 谷歌登录 在我的应用程
  • Shell脚本通过curl调用API并处理响应

    我需要创建一个通过curl 调用我的登录API 的shell 脚本 该脚本应该能够存储和处理来自curl api 调用的响应 myscript sh bin bash echo Extract bearer token from curl
  • 当用户信息属于公司设备时Rails设备

    我为公司创建了一个设计 我创建了一个用户表 希望我想要存储用户信息密码等 当用户注册时 我希望它创建一个新用户并与公司关联 我公司型号 has one 用户 我的用户模型 所属 公司 我应该如何覆盖注册控制器 此致 Rails 初学者 如果
  • 是否可以将 FastAPI 与 Django 一起使用?

    我是一名 Django 开发人员 最近偶然发现了 FastAPI 框架 然后我决定尝试一下 但通常当您谈论使用 Django 构建 RESTful API 时 您通常会使用 Django Rest Framework DRF 有人知道是否可
  • 带有客户端证书身份验证的curl

    我们喜欢使用客户端证书身份验证而不是基本身份验证来访问网络服务器 证书是 PEM 证书 密钥文件是单独的文件 卷曲调用如下所示 curl v cert cert crt key key key pass foobar https tests
  • 什么时候使用 zip 代替 izip 更好?

    什么时候使用比较好zip https docs python org 2 library functions html zip代替itertools izip https docs python org 2 library itertool

随机推荐