密码重置链接未重定向到网站

2024-04-13

我正在尝试使用 django Rest 框架在我的 React 应用程序中实现密码重置功能。我正在使用rest_auth。

Issue:当我尝试从网站重置密码后,它会将密码重置链接发送到电子邮件。但单击该链接后,它会重定向到 DRF 默认密码重置页面,而不是我网站所需的密码重置页面。当我从本地主机尝试它时,它工作正常。但一旦部署到 Heroku,它就不起作用了。

一些观察结果:请考虑我通过电子邮件收到的以下链接

https://mysite.herokuapp.com/password/reset/confirm/MQ/5a1-f42302b192f38cf29a3/ https://mysite.herokuapp.com/password/reset/confirm/MQ/5a1-f42302b192f38cf29a3/

如果我强行删除 URL 中的尾部斜杠 ( / ),那么它会重定向到我的网站密码重置页面,然后它会按预期工作。我尝试从 React 的 axios 请求中删除尾部斜杠,但它不起作用。

我需要在 Heroku 上配置任何东西吗?

这是我的密码重置页面的 React 路线

<Route path='/password/reset/confirm/:uid/:token/' component={PasswordRestConfirm} />

下面的操作在提交表单后触发。

export const setNewPassword = (new_password1, new_password2, uid, token) => (dispatch, getState) => {

dispatch({ type: SET_NEW_PASSWORD_START });

var bodyFormData = new FormData();

bodyFormData.append('new_password1', new_password1);
bodyFormData.append('new_password2', new_password2);
bodyFormData.append('uid', uid);
bodyFormData.append('token', token);

axios
    .post(`https://mysite.herokuapp.com/password/reset/confirm/${uid}/${token}/`, bodyFormData)
    .then(res => {
        dispatch(createMessage({ passwordChangeSuccess: 'Your password was set successfully' }));
        dispatch({
            type: SET_NEW_PASSWORD,
            payload: res.data
        });

    })
    .catch(err => {
        dispatch(returnErrors(err.response.data, err.response.status));
        dispatch({
            type: SET_NEW_PASSWORD_FAIL
        });
    });

};

设置.py

ALLOWED_HOSTS = ['mysite.herokuapp.com']

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',


    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'corsheaders',
    'rest_auth',
    'rest_auth.registration',
    'rest_framework',
    'rest_framework.authtoken',
    # Some other app


]

SITE_ID = 1

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ),
}


REST_AUTH_SERIALIZERS = {
    'PASSWORD_RESET_SERIALIZER': 'accounts.api.serializers.PasswordResetSerializer',
    'PASSWORD_RESET_CONFIRM_SERIALIZER ': 'accounts.api.serializers.PasswordResetConfirmSerializer',

}

REST_SESSION_LOGIN = True

CORS_ORIGIN_ALLOW_ALL = True

ACCOUNT_EMAIL_REQUIRED = False

ACCOUNT_EMAIL_VERIFICATION = 'none'

ACCOUNT_UNIQUE_EMAIL = True

ACCOUNT_AUTHENTICATION_METHOD = 'username'



# ***********Email settings **************

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST_USER = os.environ['EMAIL_USER']
EMAIL_HOST_PASSWORD = os.environ['EMAIL_PASS']

urls.py

urlpatterns = [
    path('password/reset/confirm/<uidb64>/<token>/', PasswordResetConfirmView.as_view(), name='password_reset_confirm'),

]

view.py

class PasswordResetConfirmView(GenericAPIView):

    serializer_class = PasswordResetConfirmSerializer
    permission_classes = (AllowAny,)

    @sensitive_post_parameters_m
    def dispatch(self, *args, **kwargs):
        return super(PasswordResetConfirmView, self).dispatch(*args, **kwargs)

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(
            {"detail": _("Password has been reset with the new password.")}
        )

序列化器.py

class PasswordResetConfirmSerializer(serializers.Serializer):
    """
    Serializer for requesting a password reset e-mail.
    """
    new_password1 = serializers.CharField(max_length=128)
    new_password2 = serializers.CharField(max_length=128)
    uid = serializers.CharField()
    token = serializers.CharField()

    set_password_form_class = SetPasswordForm

    def custom_validation(self, attrs):
        pass

    def validate(self, attrs):
        self._errors = {}

        # Decode the uidb64 to uid to get User object
        try:
            uid = force_text(uid_decoder(attrs['uid']))
            print(uid)
            self.user = UserModel._default_manager.get(pk=uid)
            print(self.user)
        except (TypeError, ValueError, OverflowError, UserModel.DoesNotExist):
            raise ValidationError({'uid': ['Invalid value']})

        self.custom_validation(attrs)
        # Construct SetPasswordForm instance
        self.set_password_form = self.set_password_form_class(
            user=self.user, data=attrs
        )
        if not self.set_password_form.is_valid():
            raise serializers.ValidationError(self.set_password_form.errors)
        if not default_token_generator.check_token(self.user, attrs['token']):
            raise ValidationError({'token': ['Invalid value']})

        return attrs

    def save(self):
        return self.set_password_form.save()

None

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

密码重置链接未重定向到网站 的相关文章

随机推荐

  • 无法更新本地预定通知内容

    在一次 WWDC 会议中 我获得了用于更新现有通知的代码片段 我认为这不起作用 正在尝试更新通知内容 首先 我请求待处理的通知UNUserNotificationCenter这总是有效的 然后 我创建新请求以使用现有唯一标识符更新通知 有
  • 如何摆脱警告 .ts 文件是 TypeScript 编译的一部分,但未使用

    我刚刚将角度更新到最新9 0 0 next 4 我没有使用路由 但更新后突然我不断看到此警告 如何删除此警告 警告src war angular src app app routing module ts是其一部分 TypeScript 编
  • 如何制作单一实例表单(而不是申请表)?

    在我的 C 应用程序中 我有一个可以从菜单命令打开的选项对话框 我想确保选项对话框只有一个实例 用户无法在给定时间打开多个选项窗口 而不使其成为模式 此外 如果用户已经打开了此窗口 并且他单击菜单项再次打开它 则应用程序只会使已经可见的表单
  • 什么时候应该调用 glGetError?

    glLoadIdentity http www opengl org sdk docs man xhtml glLoadIdentity xml says GL INVALID OPERATION如果生成glLoadIdentity之间执行
  • Visual Studio 代码覆盖率未显示所有程序集

    我的 SLN 文件中有 20 个项目 我正在通过测试资源管理器运行单元测试并生成代码覆盖率 只有八个项目出现在报道中 见屏幕截图 我正在使用一个 runsettings 文件 其中注释掉了所有 标记的内容 如下所示
  • 忽略空格的查询

    运行查询以便字段中的空格是最好的方法是什么 被忽视 例如 以下查询 SELECT FROM mytable WHERE username JohnBobJones SELECT FROM mytable WHERE username Joh
  • 查找 GIT 中具有特定单词/行的最新提交

    如果我有一个包含最新提交的文件 如下所示 class A String name Mary 在特定的提交中 String name Mary 被更改为String name Bob 问题是 这一行已经被修改了几次 有一次是 John 另一个
  • 上传数据到Meteor/Mongodb

    我有一个 Meteor 应用程序 想将数据 从 csv 上传到流星集合 我已经发现 解决方案 例如集合fs https github com CollectionFS Meteor CollectionFS 处理文件上传 方法用于直接上传
  • 如何在 Windows Azure 上部署 Java 应用程序

    您好 我是一名计算机科学专业三年级学生 我已经在 netbeans 上用 java 创建了一个三年级项目 现在我想将其部署到带有 windows azure 的虚拟机上 重点是 我希望能够在任何连接到互联网的计算机上使用这个应用程序 只需访
  • 单链打印C++

    我正在尝试以 1 2 3 4 etc 格式选择我的链 您可以在下面找到头文件 其中包含节点的布局 我只是对如何循环浏览列表以打印项目感到困惑 任何指导将不胜感激 set h using namespace std include
  • Go:在二进制文件中嵌入静态文件

    这可能是一个非常业余的问题 我正在尝试将静态文件嵌入到二进制文件中 即 html 我该怎么做https github com jteeuwen go bindata https github com jteeuwen go bindata
  • front() 和 begin() 之间的区别

    两者有什么区别front and begin 许多 STL 容器中出现的函数 begin http www cplusplus com reference stl list begin 返回一个可用于迭代集合的迭代器 而front http
  • OnItemCLickListener 在列表视图中不起作用

    Activity班级代码 conversationList ListView findViewById android R id list ConversationArrayAdapter conversationArrayAdapter
  • 从干草堆索引中删除对象

    我使用 django 删除一条记录 r model objects get id 1 r delete 现在我想从索引中删除记录而不重新索引 如何 我无法让remove object工作并且干草堆文档 http django haystac
  • 从 Windows 服务打印 pcl 文件的 LPR 命令不起作用(现在是托盘应用程序)

    我已经四处寻找可能的解决方案和解释一段时间了 但我找不到任何东西 以下命令正在从 Windows 服务运行 如果直接在 cmd 中使用 相同的命令也可以运行 它不会返回任何错误或与此相关的任何其他内容 System Diagnostics
  • 每 5 分钟自动运行一次 Selenium 测试

    有没有办法自动执行每五分钟运行一次的硒测试 如果您已将测试打包为可执行文件 最简单的方法可能是运行 CRON 作业或 Windows 计划任务 也就是说 Hudson 或另一个持续集成系统 几乎肯定是更好的长期策略
  • 日期格式:Android 联系人生日周年纪念日

    处理联系人生日和周年纪念日 我得到这样的详细信息和生日 12 2 2012 或 12 2 2012 或 12 02 2012 或 2 12 12 问题 所有三星手机的日期格式都相同吗 如果是 日期格式是什么 猜测不适用于所有 Android
  • sbt 中未解决的依赖关系

    运行我的sbt构建 我得到以下内容未解决的依赖关系 warn warn UNRESOLVED DEPENDENCIES warn warn com typesafe play sbt link 2 2 0 not found warn co
  • t-SQL 授予表删除和创建权限

    如何授予某些用户仅在 VB net 2005 Win 应用程序访问的 SQL 2005 数据库中删除和创建单个表的权限 有些文章建议授予表的控制权 但我无法做到这一点 如果您认为这是正确的方法 您能告诉我正确的语法吗 您不能在单个表上分配
  • 密码重置链接未重定向到网站

    我正在尝试使用 django Rest 框架在我的 React 应用程序中实现密码重置功能 我正在使用rest auth Issue 当我尝试从网站重置密码后 它会将密码重置链接发送到电子邮件 但单击该链接后 它会重定向到 DRF 默认密码