找回密码
 立即注册
搜索
0

csrf令牌与laravel不匹配

lacken 2024-7-29 14:00:23 79 显示全部楼层
[md]使用 Laravel 8 时,用户注册时我提供了一个网站屏幕,用户可以在该屏幕上选择各种账户类型。用户选择类型后,就会开始手机号认证流程。流程以弹出窗口的形式进行。

完成身份验证后,弹出窗口关闭并跳转到会员注册页面。表单提交后,方法转向 POST。

为了防止用户在未经认证的情况下直接输入 URL 进入会员注册页面,我设置了 `certForm` 标签的方法为 POST。

我现在遇到的问题是正常的完成了身份验证,弹出窗口关闭,提交了 `certForm` 标签,页面跳转了。然后出现了 csrf token 不匹配的错误。

问题出在哪里?

这是我的代码:

```php
public function verify(Request $request) {
    $identityVerification = new IdentityVerification();
    $iv = $identityVerification->verify($request->post());
   
    if($iv["Resultcd"] == "0000") {
        echo "<script>window.opener.document.getElementById('cert').value = 'ok';</script>";
        echo "<script>alert('DONE.');</script>";
        echo "<script>window.opener.document.certForm.submit();</script>";
        echo "<script>window.close();</script>";
    } else {
        echo "<script>alert('FAILED');</script>";
        echo "<script>location.href = '/login';</script>";
    }
}
public function render()
{
    return view('livewire.register-type');
}
```
...

遇到身份验证正常完成,弹出窗口关闭,`certForm` 表单提交,页面跳转后,出现了 CSRF token 不匹配的错误。

问题可能出在以下几个方面:

1. **CSRF Token 过期**:Laravel 默认每 2 小时刷新一次 CSRF Token。如果弹出窗口打开的时间超过这个时间限制,Token 可能已经过期。

2. **Token 未更新**:当弹出窗口关闭并提交表单时,可能使用的是旧的 CSRF Token。确保每次打开表单时都生成新的 Token。

3. **Token 同步问题**:由于使用了弹出窗口进行身份验证,可能存在 CSRF Token 同步问题。确保弹出窗口和父页面的 CSRF Token 是一致的。

4. **Laravel 会话配置**:检查 Laravel 的会话配置,确保会话是持久的,并且没有因为配置问题导致 CSRF Token 丢失。

5. **前端 JavaScript 逻辑**:在 `verifyNumber` 函数中,你设置了表单的 `action` 属性,但未更新 CSRF Token。尝试在提交表单前,通过 JavaScript 动态插入最新的 CSRF Token。

6. **服务器配置**:服务器或中间件配置可能导致 CSRF Token 问题。检查服务器设置,确保它们不会导致 CSRF Token 问题。

7. **Laravel 版本问题**:你使用的是 Laravel 8,但 Laravel 8 的 CSRF Token 机制可能与旧版本有所不同。检查 Laravel 8 的文档,了解 CSRF Token 的具体工作方式。

解决这个问题,你可以尝试以下步骤:

- 确保每次打开表单时都包含最新的 CSRF Token。
- 检查服务器和 Laravel 配置,确保它们支持 CSRF Token 的正确工作。
- 如果问题仍然存在,考虑在 Laravel 社区或相关论坛上寻求帮助,可能有其他开发者遇到过类似的问题。
[/md]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册