Php &引用;此密码重置令牌无效";在laravel 6.9.0上设置区域设置前缀后
在我的routes/web中设置区域设置后,尝试重置密码时出现此问题,如下所示: 路由/网络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
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]
);
}