gpt4 book ai didi

php - 通过在电子邮件而不是短信中发送代码来确保帐户安全 : Laravel 5. 2

转载 作者:可可西里 更新时间:2023-11-01 12:19:02 25 4
gpt4 key购买 nike

当我们第一次登录我们的 Gmail 帐户或删除缓存和 cookie 后,我们会看到一个窗口来输入发送到我们手机的代码。

我正在尝试通过电子邮件而不是短信来实现这一点。下面是我实现这一点的方法。

I am following this link :https://laravel.com/docs/5.2/session

并创建一个 Session table数据库中。我还可以在 session 表记录中查看我的浏览器详细信息。我不确定这是否是正确的方法。

Gmail 提供跟踪多个浏览器的功能。这意味着如果我上次从 Firefox 登录,这次从 Chrome 登录,那么我将再次被要求输入代码。展望 future ,如果不删除缓存/cookie,我将不会被要求为 Chrome 和 Firefox 填写代码。

有人可以给我任何链接来解释如何在缓存/cookie 保存时为多个浏览器做准备吗?这样我就可以发送电子邮件以获取安全代码

最佳答案

您可以通过发出一个额外的 cookie(比如 browser_cookie)来记住已经通过身份验证的浏览器来实现这一点。

执行:

创建下表(browser_management):

token (pk)| user_id (fk) | series_identifier

在哪里:
  • token :发给用户的哈希形式的 token (使用 bcrypt 或类似算法)(发给用户的 token 本身是不可猜测的从适当大空间随机生成的 key )
  • series_identifier :从适当大的空间中随机生成的不可猜测的 key

  • 每当,用户登录检查 browser_cookie .

    案例1:用户是第一次登录。

    考虑到用户是第一次登录 browser_cookie不会出现。因此,您将发送一封带有身份验证代码的电子邮件。

    一旦通过身份验证,为 token 分别生成两个随机数和 series_identifier .存储散列 tokenseries_identifierbrowser_management表,用于由 user_id 标识的用户.

    另外,发出 browser_cookie给用户 tokenseries_identifier .

    案例2:用户下次重新登录。

    现在,当同一用户下次登录时,取 token并在 browser_management 中找到条目带有散列的表 token .

    如果找到,请检查 user_idseries_identifier火柴。

    案例 2.1:匹配的条目:

    允许用户无需重新验证电子邮件代码即可进入系统。

    生成另一个 token 并替换 tokencookie以及 table与新的。 (这将降低 session 劫持的风险)。

    案例 2.2:条目不匹配:

    按照电子邮件身份验证步骤操作,并就可能的盗窃情况通知用户。(如 gmail 通知新浏览器登录)。

    引用:
  • Improved Persistent Login Cookie Best Practice
  • What is the best way to implement “remember me” for a website?

  • 更新:

    示例代码:

    迁移:
    <?php

    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;

    class browser_management extends Migration
    {
    /**
    * Run the migrations.
    *
    * @return void
    */
    public function up()
    {
    Schema::create('browser_management', function (Blueprint $table) {
    $table->string('token');
    $table->string('user_id');
    $table->string('series_identifier');
    $table->timestamps();
    $table->primary('token');
    $table->foreign('user_id')->references('id')->on('users');
    });
    }

    /**
    * Reverse the migrations.
    *
    * @return void
    */
    public function down()
    {
    Schema::drop('users');
    }
    }

    中间件:创建一个新的中间件
    <?php
    namespace App\Http\Middleware;

    use Closure;
    use Illuminate\Support\Facades\Auth;
    use Cookies;

    class Email_verification
    {
    public function handle($request, Closure $next, $guard = null)
    {
    //retrieve $token from the user's cookie
    $token = $request->cookie('browser_cookie');

    //check id token is present
    if($token == null){
    //if token is not present allow the request to the email_verification
    return $next($request);
    }
    else{
    //Retrieve the series_identifier issued to the user
    $series_identifier = Auth::user()
    ->series_identifier(Hash::make($token))
    ->first()
    ->series_identifier;

    //Check if series_identifier matches
    if($series_identifier != $request->cookie('series_identifier')){
    //if series_identifier does not match allow the request to the email_verification
    return $next($request);
    }
    }

    return redirect('/dashboard'); //replace this with your route for home page
    }
    }

    kernel.php 中制作中间件的条目
    protected $routeMiddleware = [
    'email_verification' => \App\Http\Middleware\Email_verification::class,
    //your middlewares
    ];

    用户型号:将以下方法添加到您的用户模型中
    // method to retrieve series_identifier related to token
    public function series_identifier($token){
    return $this->hasMany(Browser_management::class)->where('token',$token);
    }

    //method to retriev the tokens related to user
    public function tokens (){
    return $this->hasMany(Browser_management::class);
    }

    浏览器管理模型:创建一个模型来表示 browser_managements 表
    <?php

    namespace App\Models;

    use Illuminate\Database\Eloquent\Model;


    class Browser_management extends Model
    {
    protected $primaryKey = 'token';
    protected $fillable = array('token','series_identifier');

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

    邮箱验证方式:将以下方法添加到您的 AuthController 以处理电子邮件验证
    public function getVerification(Request $request){
    //Create a random string to represent the token to be sent to user via email.
    //You can use any string as we are going to hash it in our DB
    $token = str_random(16);

    //Generate random string to represent series_identifier
    $series_identifier = str_random(64);

    //Issue cookie to user with the generated series_identifier
    Cookie::queue('series_identifier', $series_identifier,43200,null,null,true,true);

    //Store the hashed token and series_identifier ini DB
    Auth::user()->tokens()->create(['token'=>Hash::make($token)]);

    //Your code to send an email for authentication

    //return the view with form asking for token
    return view('auth.email_verification');
    }

    public function postVerification(Request $request){
    //Retrieve the series_identifier issued to the user in above method
    $series_identifier = $request->cookie('series_identifier');

    //Retrieve the token associated with the series_identifier
    $token = Auth::user()
    ->tokens()
    ->where('series_identifier',$series_identifier)
    ->first()
    ->value('token');

    //Check if the user's token's hash matches our token entry
    if(Hash::check($request->token,$token)){
    // If token matched, issue the cookie with token id in it. Which we can use in future to authenticate the user
    Cookie::queue('token', $token,43200,null,null,true,true);
    return redirect('dashboard');
    }

    //If token did not match, redirect user bak to the form with error
    return redirect()->back()
    ->with('msg','Tokens did not match');
    }

    路线:添加这些路由以处理电子邮件验证请求。我们还将向其中添加 email_verification 中间件。
    Route::get('/auth/email_verification',`AuthController@getVerification')->middleware('email_verification');
    Route::post('/auth/email_verification',`AuthController@postVerification')->middleware('email_verification');<br/>

    更新 2:

    关于gmail的流量..
    我遵循以下步骤:
    1) 登录 gmail,然后进行两步验证。
    2)退出
    3)清除缓存 link
    4)重新登录

    当我再次登录时,在 之后清除缓存 ,它没有要求我进行两步验证。

    虽然,如果你 清除 cookie ,它将要求进行两步验证。
    原因:
    识别用户的所有用户数据(此处为 token )都存储在 cookie 中。如果您清除 cookie,服务器将没有机制来识别用户。

    更新 3:

    Gmail 要求进行两步验证:
    首先,Gmail 或任何其他网站不会收到有关清除缓存的通知
    如给定 here:

    The cache is nothing more than a place on your hard disk where the browser keeps things that it downloaded once in case they’re needed again.



    现在,cookies 是服务器发出的用于存储用户相关信息的小文本文件。如给定 here

    The main purpose of a cookie is to identify users and possibly prepare customized Web pages or to save site login information for you.



    因此,基本上当您清除浏览器中的 cookie 时,网络服务器将不会获取任何用户数据。因此,用户将被视为访客,并会得到相应的对待。

    关于php - 通过在电子邮件而不是短信中发送代码来确保帐户安全 : Laravel 5. 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38782995/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com