我正在使用 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
我使用 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 和 ? …
我在我的 WebApp 中使用 Djoser 进行身份验证,效果非常好。但是,我担心一些端点,例如
auth/users
Run Code Online (Sandbox Code Playgroud)
如果传递了令牌,则返回所有用户。我不会使用此端点,并将在前端禁用它,因为我不希望我的用户也使用它。但我还是很担心。如何禁用 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)
我收到以下错误。你如何解决这个问题?
Run Code Online (Sandbox Code Playgroud)TypeError at /auth/users/create create_user() missing 1 required positional argument: 'username'
我无法通过激活链接激活用户。
如何正确配置处理他们的请求的路径?
我的配置:
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) 如何更改电子邮件 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) 我对如何修改 Djoser 的注册端点感到困惑。我想做的就是向端点添加范围限制,但我不明白如何覆盖它。文档上的此页面讨论了它:https ://djoser.readthedocs.io/en/2.1.0/ adjustment.html 但它似乎已经过时了?今天如何使用 UserViewSet 来完成并确保 url 按预期工作?
我有一个 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 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) 我已经使用 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”函数内的令牌,但我不知道如何
我的仓库(链接)
我只想在登录响应中提供用户详细信息,
目前,我越来越'token'
并'refresh'
在
http://127.0.0.1:8000/auth/jwt/create/
JWT登录API响应。
我想返回登录用户详细信息
这是 的响应快照jwt/create/
,
djoser ×13
django ×11
python ×2
django-ninja ×1
django-rest-framework-simplejwt ×1
django-views ×1
python-3.x ×1
reactjs ×1
vue.js ×1