Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php &引用;此密码重置令牌无效";在laravel 6.9.0上设置区域设置前缀后_Php_Laravel - Fatal编程技术网

Php &引用;此密码重置令牌无效";在laravel 6.9.0上设置区域设置前缀后

Php &引用;此密码重置令牌无效";在laravel 6.9.0上设置区域设置前缀后,php,laravel,Php,Laravel,在我的routes/web中设置区域设置后,尝试重置密码时出现此问题,如下所示: 路由/网络 Route::get('/', function () { return redirect(app()->getLocale()); }); Route::group( [ 'prefix' => '{locale}', 'where' => ['locale' => '[a-zA-Z]{2}'], 'middleware' => 'locale' ], func

在我的routes/web中设置区域设置后,尝试重置密码时出现此问题,如下所示:

路由/网络

Route::get('/', function () {
    return redirect(app()->getLocale());
});

Route::group( [ 'prefix' => '{locale}', 'where' => ['locale' => '[a-zA-Z]{2}'], 'middleware' => 'locale' ], function () {

    Route::get('/', function () {
        return view('welcome');
    })->name('welcome');

    // Auth::routes(['reset' => false]);
    Auth::routes(['except' => 'reset']);

    Route::get('/home', 'HomeController@index')->name('home');

    // register
    Route::post('register/', 'Auth\RegisterController@showRegistrationForm')->name('registerplan');
    Route::post('register/create', 'Auth\RegisterController@register')->name('register');
});
正如您所看到的,我有一个前缀,我必须在所有链接上设置,我有一个中间件locale,其中我将locale前缀设置为默认值,以避免每次在每个链接中设置locale

区域设置中间件

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;

class Locale
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        app()->setLocale($request->segment(1));
        URL::defaults(['locale' => $request->segment(1)]);
        return $next($request);
    }
}
到目前为止还不错,现在问题来了,当我试图重置一个用户密码;单击laravel应用程序发送的电子邮件上的重置链接(示例:)并填写重置密码表单后,获取错误此密码重置令牌无效。

我所尝试的

我测试在routes/web文件中将验证路由移动到前缀组之外,然后重置工作,因此

我的结论

可能前面提到的PasswordController获得的是区域设置,而不是令牌,但我不知道如何修复它

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;

class ForgotPasswordController extends Controller
{
    use SendsPasswordResetEmails;
}

提前感谢dev家人的帮助

对于一个多语言项目,我采用了类似的方法

问题是,令牌现在由
{locale}
前缀设置,这导致了无效令牌问题

要修复此问题,您需要将
/Http/Controllers/Auth/ResetPasswordController.php中
/illumb/Foundation/Auth/ResetsPasswords.php的
showretForm()
函数重写为:

公共函数showResetForm(请求$Request,$token=null)
{
$token=$request->token;
返回视图('auth.passwords.reset')->带有(
['token'=>$token,'email'=>$request->email]
);
}

这将解决在尝试重置用户密码时出现的无效令牌问题。

对于多语言项目,我采用了类似的方法

##ResetPassword.php  ###Chnanged URL {locale}##   
$locale=app()->getLocale();   
return (new MailMessage)
            ->subject(Lang::get('Reset Password Notification'))
            ->line(Lang::get('You are receiving this email because we received a password reset request for your account.'))
           // ->action(Lang::get('Reset Password'), $url)
           ->action('Reset Password', url($locale . '/password/reset', $this->token))

            ->line(Lang::get('This password reset link will expire in :count minutes.', ['count' => config('auth.passwords.'.config('auth.defaults.passwords').'.expire')]))
            ->line(Lang::get('If you did not request a password reset, no further action is required.'));
    }



##############ResetPasswordController  ##
##Add this code in ResetPasswordController ##

    public function showResetForm(Request $request, $token = null)
{
    $token = $request->token;

    return view('auth.passwords.reset')->with(
        ['token' => $token, 'email' => $request->email]
    );
}
问题是,令牌现在由
{locale}
前缀设置,这导致了无效令牌问题

要修复此问题,您需要将
/Http/Controllers/Auth/ResetPasswordController.php中
/illumb/Foundation/Auth/ResetsPasswords.php的
showretForm()
函数重写为:

公共函数showResetForm(请求$Request,$token=null)
{
$token=$request->token;
返回视图('auth.passwords.reset')->带有(
['token'=>$token,'email'=>$request->email]
);
}

这将解决在尝试重置用户密码时出现的无效令牌问题。

当您生成重置链接时,在应用程序名称之后和区域设置之前,有两个
/
会使令牌无效。我只是在URL中修复了这一问题,但在生成重置链接时不会修复问题,在应用程序名称之后和区域设置之前,有两个
/
使令牌无效。我只是在URL中修复了这一点,但没有修复问题。请解释一个BIT在这种情况下,使用前缀时,
$token
将前缀作为其值,因为它不再是第一个参数。因此,与存储在数据库中的已创建令牌不匹配。通过重写
showreteform()
函数并设置
$token=$request->token
我们正在获取正确的参数及其值,并再次匹配存储在de数据库中的令牌。您能否解释一个BIT在这种情况下,当使用前缀时,
$token
将前缀作为其值,因为它不再是第一个参数。因此,与存储在数据库中的已创建令牌不匹配。通过重写
showreteform()
函数并设置
$token=$request->token我们正在获取正确的参数及其值,并再次匹配存储在de数据库中的令牌。
##ResetPassword.php  ###Chnanged URL {locale}##   
$locale=app()->getLocale();   
return (new MailMessage)
            ->subject(Lang::get('Reset Password Notification'))
            ->line(Lang::get('You are receiving this email because we received a password reset request for your account.'))
           // ->action(Lang::get('Reset Password'), $url)
           ->action('Reset Password', url($locale . '/password/reset', $this->token))

            ->line(Lang::get('This password reset link will expire in :count minutes.', ['count' => config('auth.passwords.'.config('auth.defaults.passwords').'.expire')]))
            ->line(Lang::get('If you did not request a password reset, no further action is required.'));
    }



##############ResetPasswordController  ##
##Add this code in ResetPasswordController ##

    public function showResetForm(Request $request, $token = null)
{
    $token = $request->token;

    return view('auth.passwords.reset')->with(
        ['token' => $token, 'email' => $request->email]
    );
}