2016-11-12 54 views
0

我想就通過電子郵件激活用戶的最有效方式提出一些建議。當用戶註冊時,我想要創建一個激活碼,它將通過電子郵件發送,表示他們需要激活(激活碼以域名作爲參數以令牌形式發送)。但是,我不知道什麼最好的數據庫結構來處理這將是...通過電子郵件laravel(5.3)處理用戶激活的數據庫設置?

簡單的選擇,我相信,將有在users表中activation_tokenactivated列,當URL與匹配用戶和activation_token被擊中,activated將變爲true /!0。雖然很簡單,但我希望在用戶表上儘可能節省空間。

或者,我可以製作一個包含user_id, token, activatedactivation表,並創建usersactivation之間的一對一關係。在User型號有:

public function activation() { 
    return $this->hasOne('App\Activation'); 
} 

public function activated() { 
    return $this->activation->activated != 0 ? true:false; 
} 

同樣,當令牌參數的URL被擊中的用戶,更改activated 1 /真。

激活鏈接和註冊確認正被推送到一個隊列中,所以我不會過分擔心用戶可以激活的速度,但更多的時間是用來驗證用戶的額外時間額外的參數是必需的。

我確定有可能有更好的方法來做到這一點,但在谷歌搜索用戶激活laravel 5.3後,結果通常是過時的方法和laravel版本的過時包或教程。除此之外,可用軟件包並不特別輕巧,並且具有許多我根本不需要的配置設置,因此不需要,因爲當我自己能夠做到這一點時,我看不到堵塞的重點。我也不願意拖過別人的包裹,並刪除不必要的批量(根據我的需要)。

那麼,任何人都可以請建議一個更好的選擇,或支持上述想法之一?

回答

0

您可以使用在用戶電子郵件上發送激活鏈接的技術來激活自己的帳戶。由於答案會是一個很長,但我會盡量做到了儘可能短:

的用戶的模式是這樣的:

users 
    - id 
    - name 
    - email 
    - is_email_activated 
    - activation_token 

控制器會是這樣(而創建帳戶的用戶):

class UsersController { 

    function create() { 
     $user = User::create(request()->all()); 

     $activation_token = $this->encryptData($user->id); 
     $activation_link = route('verify_token', ['token' => $activation_token]); 

     $user->activation_token = $activation_token; 
     $user->save(); 

     // Send mail to user with activation link... 
    } 

    function encryptData($id, $delimiter='|', $expiry = 1) { 
     $data[] = $id; 
     $data[] = rand(0,999999); 
     $data[] = time(); // This param can help us to retrieve the token generation time at the time of verification 
     $key = implode($delimiter, $data); 
     $key = Crypt::encrypt($key); 
     return $key; 
    } 

} 

現在發送到用戶的電子郵件中的鏈接應指向的路徑:

Route::get('users/activation/{token}', [email protected])->name('verify_token'); 

驗證方法如下所示:

class UsersController { 

    function verifyToken($key) { 
     $key = Crypt::decrypt($key); 
     $data = explode("|", $key); 
     $data['id'] = $data[0]; 
     $data['previous_time'] = $data[2]; 
     $data['success'] = true; 

     $user = User::find($data['id']) 

     // Token valid if user is found and token is valid for only 24 Hrs Check (not mandatory in case of email activation, you should use this in case of resetting user's password) 
     if($user && (time() - ($data['previous_time'] <= 86400))) { 
      // User validated and make is_email_activated column to true/1 
     } 
    } 

} 

希望這有助於您!

相關問題