标签: djoser

Django、Djoser 社交身份验证:在服务器端会话数据中找不到状态。状态代码 400

我正在使用 django 和 React 实现一个身份验证系统。这两个应用程序分别在端口 8000、3000 上运行。我使用 Djoser 包实现了身份验证系统。该包使用一些依赖项social_core和social_django。一切似乎都配置正常。我点击登录谷歌按钮...我被重定向到谷歌登录页面,然后返回到端口 3000 处的前端 React 应用程序,并在 url 上显示状态代码参数。

此时,我将这些参数发布到后端。后端尝试使用以下代码验证状态检查会话存储中是否存在状态密钥(social_core/backends/oauth.py

def validate_state(self):
        """Validate state value. Raises exception on error, returns state
        value if valid."""
        if not self.STATE_PARAMETER and not self.REDIRECT_STATE:
            return None
        state = self.get_session_state()
        request_state = self.get_request_state()
        if not request_state:
            raise AuthMissingParameter(self, 'state')
        elif not state:
            raise AuthStateMissing(self, 'state')
        elif not constant_time_compare(request_state, state):
            raise AuthStateForbidden(self)
        else:
            return state
Run Code Online (Sandbox Code Playgroud)

此时,由于某些原因,状态会话密钥不存在......并且我收到一条错误,指出在会话数据中找不到状态(错误如下)

{"error":["State could not be found in server-side session data."],"status_code":400} …
Run Code Online (Sandbox Code Playgroud)

django django-socialauth django-rest-framework reactjs djoser

11
推荐指数
1
解决办法
2804
查看次数

简单的 JWT 向令牌中的有效负载数据添加额外的字段

我使用 djoser 和 rest_framework_simplejwt。这是我的用户模型;

class userProfile(models.Model):

    user=models.OneToOneField(User,on_delete=models.CASCADE,related_name="profile")
    date_joined=models.DateTimeField(auto_now_add=True)
    updated_on=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.user.username
Run Code Online (Sandbox Code Playgroud)

我的 views.py 为用户获取令牌在下面给出;

class CustomTokenObtainPairView(TokenObtainPairView):

serializer_class = CustomTokenObtainPairSerializer
token_obtain_pair = TokenObtainPairView.as_view()
Run Code Online (Sandbox Code Playgroud)

这是serializer.py;

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
    data = super(CustomTokenObtainPairSerializer, self).validate(attrs)
    data.update({'user': self.user.username})
    data.update({'id': self.user.id})
    data.update({'first_name': self.user.first_name})
    data.update({'last_name': self.user.last_name})
    data.update({'is_superuser': self.user.is_superuser})
    return data
Run Code Online (Sandbox Code Playgroud)

我可以像这样获得访问和刷新令牌。

    {
    "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTU4ODQxMDY0OCwianRpIjoiNTY2MDhhOGVjYzRiNDZhMmFjYjc0Y2VmMzE2ZGE4YTkiLCJ1c2VyX2lkIjo3fQ.gXk9y3Vq0NlB8ZpU9SFcLWAMplr4_ECTeBg5WTMAuNY",
    "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTg4NDA5NzQ4LCJqdGkiOiIxM2VlYzQ1MjZkMTQ0ODI4YjgxNjVkZTA0MzlmYjBmMSIsInVzZXJfaWQiOjd9.sQ1G3rur1h3yqj79ZYvzHK1o6mgtHYuzJZlh5OCyg84",
    "user": "x",
    "id": 5,
    "first_name": "x",
    "last_name": "x",
    "is_superuser": false,

}
Run Code Online (Sandbox Code Playgroud)

当使用 jwt.io 有效载荷数据编码令牌时;

{
  "token_type": "access",
  "exp": 1588329561,
  "jti": "944f97343b42448fbaf5461295eb0548",
  "user_id": 5
}
Run Code Online (Sandbox Code Playgroud)

我想在访问令牌的有效负载中添加用户 first_name、last_name 和 ? …

django djoser django-rest-framework-simplejwt

6
推荐指数
1
解决办法
2355
查看次数

Djoser 禁用未使用的端点

我在我的 WebApp 中使用 Djoser 进行身份验证,效果非常好。但是,我担心一些端点,例如

auth/users
Run Code Online (Sandbox Code Playgroud)

如果传递了令牌,则返回所有用户。我不会使用此端点,并将在前端禁用它,因为我不希望我的用户也使用它。但我还是很担心。如何禁用 Djoser 提供的这些未使用的端点?

django djoser

5
推荐指数
1
解决办法
2098
查看次数

带有 DRF 错误的 Djoser 用户名字段是必需的

我正在将 djoser 与 django Rest 框架一起使用,并且我想从创建用户表单中删除用户名字段:

settings.py:

'SERIALIZERS': {
    'user_create': 'user.serializers.UserRegistrationSerializer',
},
Run Code Online (Sandbox Code Playgroud)

serializers.py:

class UserRegistrationSerializer(BaseUserRegistrationSerializer):
    class Meta(BaseUserRegistrationSerializer.Meta):
        fields = ('email', 'password')
Run Code Online (Sandbox Code Playgroud)

我收到以下错误。你如何解决这个问题?

TypeError at /auth/users/create
create_user() missing 1 required positional argument: 'username'
Run Code Online (Sandbox Code Playgroud)

python django django-rest-framework djoser

5
推荐指数
1
解决办法
1076
查看次数

如何使用 Django Djoser 处理激活 url?

我无法通过激活链接激活用户。

如何正确配置处理他们的请求的路径?

我的配置:

DJOSER = {
    'PASSWORD_RESET_CONFIRM_URL': 'api/v1/auth/users/password/reset/confirm/{uid}/{token}',
    'USERNAME_RESET_CONFIRM_URL': 'api/v1/auth/users/username/reset/confirm/{uid}/{token}',
    'ACTIVATION_URL': 'api/v1/auth/users/activate/{uid}/{token}',
    'SEND_ACTIVATION_EMAIL': True,
    'SEND_CONFIRMATION_EMAIL': True,
    'SERIALIZERS': {},
    # 'USER_ID_FIELD': '',
    'LOGIN_FIELD': 'username',
    'USER_CREATE_PASSWORD_RETYPE': True,
    'SET_USERNAME_RETYPE': True,
    'USERNAME_RESET_CONFIRM_RETYPE': True,
    'SOCIAL_AUTH_ALLOWED_REDIRECT_URIS': [],
    'HIDE_USERS': True,
    'EMAIL': {
        'activation': 'api.email.ActivationEmail',
        'confirmation': 'api.email.ConfirmationEmail',
        'password_reset': 'api.email.PasswordResetEmail',
        'password_changed_confirmation': 'api.email.PasswordChangedConfirmationEmail',
        'username_changed_confirmation': 'api.email.UsernameChangedConfirmationEmail',
        'username_reset': 'api.email.UsernameResetEmail',
    }
}


   path('auth/', include('djoser.urls')),
   path('auth/', include('djoser.urls.jwt')),
   path('auth/', include('djoser.urls.authtoken')),
Run Code Online (Sandbox Code Playgroud)

django django-views django-rest-framework djoser

4
推荐指数
1
解决办法
3162
查看次数

4
推荐指数
1
解决办法
381
查看次数

Djoser 使用模板覆盖激活电子邮件

我一直在寻找有关如何执行此操作的更多信息,但似乎几乎没有文档帮助。

本质上我想要做的是为激活电子邮件创建一个新模板,以便链接可以以 localhost:3000 而不是 localhost:8000 开头(我使用 Vue 作为前端发布请求,这就是为什么)

我设法找到了这个:https : //github.com/sunscrapers/djoser/blob/master/djoser/templates/email/activation.html 但是当我将它添加到我自己的项目时,仍然使用默认的 Djoser 模板。

这是我的 settings.py 的样子:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)

如果手动将 8000 替换为 3000,我的激活 URL 有效:

 'ACTIVATION_URL': 'registration/activate/{uid}/{token}',
Run Code Online (Sandbox Code Playgroud)

模板/电子邮件/activation.html:

{% block subject %}
{% blocktrans %}Account activation on {{ site_name }}{% endblocktrans %}
{% endblock subject %}

{% block text_body %}
{% blocktrans %}You're receiving this …
Run Code Online (Sandbox Code Playgroud)

django-templates python-3.x django-rest-framework djoser

4
推荐指数
1
解决办法
1880
查看次数

Djoser - 覆盖注册

我对如何修改 Djoser 的注册端点感到困惑。我想做的就是向端点添加范围限制,但我不明白如何覆盖它。文档上的此页面讨论了它:https ://djoser.readthedocs.io/en/2.1.0/ adjustment.html 但它似乎已经过时了?今天如何使用 UserViewSet 来完成并确保 url 按预期工作?

django-rest-framework djoser

4
推荐指数
1
解决办法
2208
查看次数

Djoser 在电子邮件中使用不同的域

我有一个 VueJS/Django 休息框架应用程序,并在用户注册时处理确认电子邮件。

我的前端位于与后端不同的 URL 上,因此我尝试配置 djoser 以将激活链接放在正确的域中。

我终于设法添加 DOMAIN 和 SITE_NAME 信息,但结果并不符合预期,因为我的域名被括号括起来。

在我的 Django 设置中,我有:

DOMAIN = 'localhost:8080',
SITE_NAME = 'Frontend',
DJOSER = {
    'PASSWORD_RESET_CONFIRM_URL': '#/password/reset/confirm/{uid}/{token}',
    'USERNAME_RESET_CONFIRM_URL': '#/username/reset/confirm/{uid}/{token}',
    'ACTIVATION_URL': 'activate/{uid}/{token}',
    'SEND_ACTIVATION_EMAIL': True,
    'SERIALIZERS': {},
}
Run Code Online (Sandbox Code Playgroud)

但邮件中的结果是:

You're receiving this email because you need to finish activation process on ('Frontend',).

Please go to the following page to activate account:

http://('localhost:8080',)/activate/MzE/an7e2w-73af66245317921904307cc266f4983e

Thanks for using our site!

The ('Frontend',) team
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么这些括号会出现在这里?

django django-rest-framework vue.js djoser

4
推荐指数
1
解决办法
939
查看次数

Djoser 用户激活电子邮件 POST 示例

我正在使用 Django rest 框架和 Djoser 进行身份验证和用户注册。

当新用户注册时,Djoser 会发送一封包含执行 GET 请求链接的激活电子邮件。为了激活,我需要从激活 URL 中提取 uid 和令牌,并向 Djoser 发出 POST 请求,以便能够激活用户。

我的环境是 Python 3 和 Django 1.11,Djoser 1.0.1。

我想做的是在Django中处理get请求,提取uid和token,然后进行POST请求。我已经提取了 uid 和令牌,并希望进行 POST(在此 GET 请求中)。我不知道如何在后台发出这个 POST 请求。

我的网址是这样的:

http://127.0.0.1:8000/auth/users/activate/MQ/4qu-584cc6772dd62a3757ee
Run Code Online (Sandbox Code Playgroud)

当我在电子邮件中单击它时,它会发出一个 GET 请求。

我在 Django 视图中处理这个。

视图需要发出这样的 POST 请求:

http://127.0.0.1:8000/auth/users/activate/

data= [(‘uid’=‘MQ’), (‘token’=‘4qu-584cc6772dd62a3757ee’),]
Run Code Online (Sandbox Code Playgroud)

我处理 GET 的观点是:

http://127.0.0.1:8000/auth/users/activate/MQ/4qu-584cc6772dd62a3757ee
Run Code Online (Sandbox Code Playgroud)

python django django-rest-framework djoser

3
推荐指数
1
解决办法
4110
查看次数

Djoser 访问令牌需要多长时间才会过期?

因此,Djoser JWT 在您登录时提供了一个访问令牌,该令牌多久会过期?

django djoser

3
推荐指数
1
解决办法
1581
查看次数

使用 djoser 进行 Django ninja 令牌身份验证

我已经使用 Django Ninja 框架实现了 CRUD,但现在我想在我的应用程序中进行身份验证,我已经安装并配置了 Djoser,所以现在我可以生成令牌,但我不知道如何在我的 CRUD 中进行验证

class AuthBearer(HttpBearer):
    def authenticate(self, request, token):
        if token == "supersecret":
            return token

@api.get("/bearer", auth=AuthBearer())
def bearer(request):
    return {"token": request.auth}
Run Code Online (Sandbox Code Playgroud)

我应该能够检查“AuthBearer”函数内的令牌,但我不知道如何

我的仓库(链接

django django-rest-framework djoser django-ninja

2
推荐指数
1
解决办法
2085
查看次数

如何从 djoser 包自定义登录 api?

我只想在登录响应中提供用户详细信息,

目前,我越来越'token''refresh'http://127.0.0.1:8000/auth/jwt/create/JWT登录API响应。

我想返回登录用户详细信息

这是 的响应快照jwt/create/

JWT 响应图像

authentication django django-rest-framework djoser

0
推荐指数
1
解决办法
1315
查看次数