سلام
استاد من وقتی بعد از ثبت نام و لاگین کردنش کاربر براش ارسال مجدد رو انجام میدم مشکلی وجود نداره ولی وقتی کاربر لاگ اوت میکنه و وارد میشه دوباره میخواد کد رو دریافت کنه ارور 404 میگیره و کد جدید رو ارسال نمیکنه میگه این Route وجود نداره
سلام بله
این کنترلر ارسال کد
class VerificationController extends Controller
{
protected $twoFactor;
public function __construct(TwoFactorAuthentication $twoFactor)
{
$this->middleware('auth');
$this->twoFactor = $twoFactor;
}
public function showVerifyForm()
{
return view('Auth.Verify');
}
public function activate()
{
$response = $this->twoFactor->requestCode(Auth::user());
return $response == $this->twoFactor::CODE_SENT ? redirect()->route('auth.register.Verify.form') : back()->with('sendCodeFail', 'ارسال کد با خطا مواجه شد لطفا چند دقیقه دیگر دوباره تلاش کنید !');
}
public function confirm(Request $request)
{
$this->validateForm($request);
$response = $this->twoFactor->activate();
if ($response === $this->twoFactor::USER_ACTIVATED) {
return redirect()->route('home');
} else {
return back()->with('sendCodeFail', 'کد وارد شده معتبر نمیباشد .');
}
}
protected function validateForm(Request $request)
{
$request->validate([
'code' => ['required', 'numeric', 'digits:4'],
], [
'code.required' => 'لطفا کد را وارد کنید',
'code.numeric' => 'کد فعال سازی مقداری عددی میباشد',
'code.digits' => 'کد نا معتبر میباشد'
]
);
}
public function resent(Request $request)
{
$this->twoFactor->resent();
return redirect()->route('auth.register.Verify.form')->with('success', 'کد احراز هویت دوباره برای شما ارسال شد');
}
}
این route
Route::get('register/verify/resent', 'VerificationController@resent')->name('auth.register.Verify.resent');
مدل two Factor
class TwoFactor extends Model
{
const CODE_EXPIRY = 60;
protected $table='two_factor';
protected $fillable=[
'user_id',
'code'
];
public static function generateCodeFor(User $user)
{
$user->code()->delete();
return static::create([
'user_id' => $user->id,
'code' => mt_rand(1000, 9999)
]);
}
public function getCodeForSendAttribute()
{
return __('auth.CodeForSend' , ['code' =>$this->code]);
}
public function send()
{
SendSms::dispatchNow($this->user , $this->code_for_send);
}
public function user(){
return $this->belongsTo(User::class);
}
public function isExpired(){
return $this->created_at->diffInSeconds(now()) > static::CODE_EXPIRY;
}
public function isEqualWith(string $code){
return $this->code == $code;
}
}
و سرویس two factor
class TwoFactorAuthentication{
const CODE_SENT = 'code.sent';
const CODE_INVALID = 'code.invalid';
const USER_ACTIVATED = 'user.activated';
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function requestCode(User $user)
{
$code = TwoFactor::generateCodeFor($user);
$this->setSession($code);
$code->send();
return static::CODE_SENT;
}
protected function setSession(TwoFactor $code)
{
session([
'user_id' => $code->user_id,
'code_id' => $code->id,
]);
}
protected function forgetSession(){
session(['user_id' , 'code_id']);
}
public function resent()
{
return $this->requestCode($this->getUser());
}
public function activate()
{
if (!$this->isValidCode()) return static::CODE_INVALID;
$this ->getToken()->delete();
$this->getUser()->activateTwoFactor();
$this->forgetSession();
return static::USER_ACTIVATED;
}
protected function isValidCode(){
return !$this->getToken()->isExpired() && $this->getToken()->isEqualWith($this->request->code);
}
protected function getToken(){
return $this->code ?? TwoFactor::findOrFail(session('code_id'));
}
protected function getUser(){
return User::findOrFail(session('user_id'));
}
}
controller here
class VerificationController extends Controller { protected $twoFactor; public function __construct(TwoFactorAuthentication $twoFactor) { $this->middleware('auth'); $this->twoFactor = $twoFactor; } public function showVerifyForm() { return view('Auth.Verify'); } public function activate() { $response = $this->twoFactor->requestCode(Auth::user()); return $response == $this->twoFactor::CODE_SENT ? redirect()->route('auth.register.Verify.form') : back()->with('sendCodeFail', 'ارسال کد با خطا مواجه شد لطفا چند دقیقه دیگر دوباره تلاش کنید !'); } public function confirm(Request $request) { $this->validateForm($request); $response = $this->twoFactor->activate(); if ($response === $this->twoFactor::USER_ACTIVATED) { return redirect()->route('home'); } else { return back()->with('sendCodeFail', 'کد وارد شده معتبر نمیباشد .'); } } protected function validateForm(Request $request) { $request->validate([ 'code' => ['required', 'numeric', 'digits:4'], ], [ 'code.required' => 'لطفا کد را وارد کنید', 'code.numeric' => 'کد فعال سازی مقداری عددی میباشد', 'code.digits' => 'کد نا معتبر میباشد' ] ); } public function resent(Request $request) { $this->twoFactor->resent(); return redirect()->route('auth.register.Verify.form')->with('success', 'کد احراز هویت دوباره برای شما ارسال شد'); } }
Route here
Route::get('register/verify/resent', 'VerificationController@resent')->name('auth.register.Verify.resent');
two factor model here
class TwoFactor extends Model { const CODE_EXPIRY = 60; protected $table='two_factor'; protected $fillable=[ 'user_id', 'code' ]; public static function generateCodeFor(User $user) { $user->code()->delete(); return static::create([ 'user_id' => $user->id, 'code' => mt_rand(1000, 9999) ]); } public function getCodeForSendAttribute() { return __('auth.CodeForSend' , ['code' =>$this->code]); } public function send() { SendSms::dispatchNow($this->user , $this->code_for_send); } public function user(){ return $this->belongsTo(User::class); } public function isExpired(){ return $this->created_at->diffInSeconds(now()) > static::CODE_EXPIRY; } public function isEqualWith(string $code){ return $this->code == $code; } }
two factor authentication service here
class TwoFactorAuthentication{ const CODE_SENT = 'code.sent'; const CODE_INVALID = 'code.invalid'; const USER_ACTIVATED = 'user.activated'; protected $request; public function __construct(Request $request) { $this->request = $request; } public function requestCode(User $user) { $code = TwoFactor::generateCodeFor($user); $this->setSession($code); $code->send(); return static::CODE_SENT; } protected function setSession(TwoFactor $code) { session([ 'user_id' => $code->user_id, 'code_id' => $code->id, ]); } protected function forgetSession(){ session(['user_id' , 'code_id']); } public function resent() { return $this->requestCode($this->getUser()); } public function activate() { if (!$this->isValidCode()) return static::CODE_INVALID; $this ->getToken()->delete(); $this->getUser()->activateTwoFactor(); $this->forgetSession(); return static::USER_ACTIVATED; } protected function isValidCode(){ return !$this->getToken()->isExpired() && $this->getToken()->isEqualWith($this->request->code); } protected function getToken(){ return $this->code ?? TwoFactor::findOrFail(session('code_id')); } protected function getUser(){ return User::findOrFail(session('user_id')); } }