使用按钮单击登录即可登录

时间:2014-01-15 15:03:38

标签: laravel laravel-4

是否可以通过laravel Mail::send()发送的邮件中的按钮进行登录?

所以我用Mail::send()向用户发送邮件。我希望用户打开邮件,点击其中的按钮,他将自动登录,以便他立即看到他的个人资料页面。

你们怎么建议我这样做?

1 个答案:

答案 0 :(得分:2)

这是我在另一个类似问题中给出的完全相同的答案。

创建一个存储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' =>'LogonController@loginByEmail')
          );

然后,当您的用户点击链接时,您可以自动登录,立即使该链接无效并将其重定向到个人资料,这是控制器方法:

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

创建一个Artisan Command以逐周期删除该表上的旧记录:

Login::where('created_at', '<=', Carbon\Carbon::now()->subDays(2))->delete();

作为另一个安全问题,您还应该检查登录代码是否过旧。

这可以是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()
    );
}

系统上的任何内容都没有附加任何字符串。