💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۵ عرفان مهدوی
مشکل در ارسال مجدد کد
جامعه لاراول ایجاد شده در ۲۳ شهریور ۱۳۹۸

سلام
استاد من وقتی بعد از ثبت نام و لاگین کردنش کاربر براش ارسال مجدد رو انجام میدم مشکلی وجود نداره ولی وقتی کاربر لاگ اوت میکنه و وارد میشه دوباره میخواد کد رو دریافت کنه ارور 404 میگیره و کد جدید رو ارسال نمیکنه میگه این Route وجود نداره

سلام میتونی کد‌های روت و کنترولرت رو بفرستی ؟ 

Amir Ahmadi ۲۴ شهریور ۱۳۹۸، ۱۲:۱۲

سلام بله 

این کنترلر ارسال کد

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

 

 

عرفان مهدوی ۲۶ شهریور ۱۳۹۸، ۰۶:۴۸

سلام ... شما رو به چه آدرسی برمیگردونه ؟‌

مهرداد سامی ۲۷ شهریور ۱۳۹۸، ۰۸:۵۹

استاد پیشنهادی برای مشکل بنده ندارید؟

 

عرفان مهدوی ۳۰ شهریور ۱۳۹۸، ۰۴:۴۵