0
是否可以通過單擊郵件中的按鈕進行登錄,由laravel Mail::send()
發送?通過郵件按鈕進行登錄
所以我發郵件給Mail::send()
的用戶。我希望用戶打開郵件,點擊它中的按鈕,他將自動登錄,以便他立即看到他的個人資料頁面。
你們會怎麼建議我這樣做?
是否可以通過單擊郵件中的按鈕進行登錄,由laravel Mail::send()
發送?通過郵件按鈕進行登錄
所以我發郵件給Mail::send()
的用戶。我希望用戶打開郵件,點擊它中的按鈕,他將自動登錄,以便他立即看到他的個人資料頁面。
你們會怎麼建議我這樣做?
這是我給另一個類似問題的完全相同的答案。
創建一個表來存儲login codes
:
public function up()
{
Schema::create('login', function($table) {
$table->string('id')->primary();
$table->string('user_id');
$table->timestamps();
});
}
你生成一個鏈接添加一行這個表中的每個時間:
$user = User::find(1);
$login = Login::create(['id' => Login::generateID(), 'user_id' => $user->id]);
$url = URL::route('loginByEmail', $login->id);
Mail::send(...)
您的登錄鏈接創建路線:
Route::get('loginByEmail/{code}',
array('as' => 'loginByEmail', 'uses' =>'[email protected]')
);
然後,當你的用戶點擊鏈接,你可以自動登錄他,立即inv alidate該鏈接並重定向他剖析,這裏的控制器方法:
public function loginByEmail()
{
$login = Login::findOrFail(Input::get('login_id'));
$user = User::find($login->user_id);
Auth::login($user);
$login->delete();
return Redirect::route('profile');
}
,並創建一個工匠命令在該表periodiacally刪除舊記錄:
Login::where('created_at', '<=', Carbon\Carbon::now()->subDays(2))->delete();
作爲另一個安全MESURE,你也應該檢查該登錄代碼是否不太舊。
這可以爲generateID()
的代碼,這是一個基本的UUID代碼生成:
public static function v4()
{
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
// 32 bits for "time_low"
random_mcrypt(), random_mcrypt(),
// 16 bits for "time_mid"
random_mcrypt(),
// 16 bits for "time_hi_and_version",
// four most significant bits holds version number 4
random_mcrypt(0x0fff) | 0x4000,
// 16 bits, 8 bits for "clk_seq_hi_res",
// 8 bits for "clk_seq_low",
// two most significant bits holds zero and one for variant DCE1.1
random_mcrypt(0x3fff) | 0x8000,
// 48 bits for "node"
random_mcrypt(), random_mcrypt(), random_mcrypt()
);
}
連接到系統上的任何這樣的字符串。