当前位置: 首页 > 知识库问答 >
问题:

在laravel 6.9上设置区域设置前缀后,“此密码重置令牌无效”。0

苏选
2023-03-14

我在尝试重置密码时遇到这个问题,在我的路由/网络中设置区域设置如下:

路线/网页

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');
});

正如您所看到的,我有一个前缀,我必须在所有链接上设置,我有一个中间件区域设置,其中我将区域设置前缀设置为默认值,以避免每次在每个链接中设置区域设置

区域设置中间件

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);
    }
}

到目前为止还不错,现在问题来了,当我试图重置一个用户密码;单击重置链接后(示例:https://cubik.app//en/password/reset/72216cd4f35fce0bf2aee9c2e09ffe16cae3a26175c752cb987df59e0312d60d?email=example@demo.com)在从laravel应用程序发送的电子邮件上,并填写重置密码表单,得到此密码重置令牌无效的错误信息。

我所尝试的

我测试将auth路由移动到路由/web文件中的前缀组之外,并且重置工作正常,因此...

我的结论

可能忘记密码控制器是获得的语言环境,而不是令牌,但我不知道如何修复它。

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家人的帮助!

共有2个答案

韩照
2023-03-14
##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]
    );
}
司空坚
2023-03-14

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

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

要修复它,您需要覆盖/Http/Controller/Auth/ResetPasswordController.php控制器中的/Illumate/Foundation/Auth/ResetsPasswords.php函数,以:

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

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

这将修复尝试重置用户密码时的无效令牌问题。

 类似资料:
  • 我写的是MVC5,使用的是Identity 2.0。 我在邮件中点击链接,我正在获得密码重置令牌并使用 结果总是false,并表示“无效令牌”。我该在哪里修?

  • 我有两台服务器使用相同的ASP。NET核心标识后端。我使用以下命令生成密码重置令牌: 我通过电子邮件链接发送此令牌。当用户单击链接时,他们会被带到一个单独的站点,该站点应提供一个用户界面来更改密码。以下代码处理用户提交令牌及其新密码的密码: 在第二台服务器上,标识结果总是返回false,因为“无效令牌”。 通过查看源代码,我看到令牌是使用IP地址生成的(因此我理解令牌验证失败的原因)。 我的问题是

  • 我有一个生成密码重置令牌的Webapi服务。 令牌生成服务endpoint:

  • 如何覆盖令牌消息“此密码重置令牌无效。” 我尝试将此添加到ResetPasswordController中,但它仍然显示默认的令牌消息。 我需要添加一个URL而不是仅仅改变文本。覆盖“密码重置令牌无效”的错误文本Laravel 我发现实际验证令牌的是$this->broker()->reset()。完全覆盖此方法是否是覆盖令牌消息的唯一方法?

  • 我在我的注解里有。yaml使用注释管线设置的以下设置: 我这里的问题是,我可以创建一个像是否不带区域设置前缀? 这是保护区,我可以使用用户语言。我尝试使用这个symfony路由文档,但我希望保留注释。 目前它看起来像,但我希望。