Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Laravel Passport记录身份验证尝试(5.3)_Php_Laravel_Authentication_Laravel Passport_Thephpleague - Fatal编程技术网

Php 如何使用Laravel Passport记录身份验证尝试(5.3)

Php 如何使用Laravel Passport记录身份验证尝试(5.3),php,laravel,authentication,laravel-passport,thephpleague,Php,Laravel,Authentication,Laravel Passport,Thephpleague,我们有一个web应用程序通过Ang 1.6.5前端使用Laravel REST API后端 我希望记录3种不同的身份验证请求结果: 1.成功的身份验证。 2.用户帐户有效,密码无效。 3.无效的用户帐户 我似乎不知道如何连接Passport的身份验证过程 我尝试使用一些自定义中间件,也是一个自定义提供者。这两种方法都不起作用,尽管可能是实施 正确的方法是什么 谢谢。无需重新编写供应商源代码,您就可以查看后续中间件,然后在它返回之前捕获它。这不是最优雅的解决方案,但可能已经足够了 很抱歉,这不是一

我们有一个web应用程序通过Ang 1.6.5前端使用Laravel REST API后端

我希望记录3种不同的身份验证请求结果: 1.成功的身份验证。 2.用户帐户有效,密码无效。 3.无效的用户帐户

我似乎不知道如何连接Passport的身份验证过程

我尝试使用一些自定义中间件,也是一个自定义提供者。这两种方法都不起作用,尽管可能是实施

正确的方法是什么


谢谢。

无需重新编写供应商源代码,您就可以查看后续中间件,然后在它返回之前捕获它。这不是最优雅的解决方案,但可能已经足够了


很抱歉,这不是一个完整的解决方案,我没有足够的分数来发表评论。

我花了一个晚上的时间在Laravel 6中思考如何做到这一点

  • 我创建了一个名为
    AccessLogMiddleware
  • 将中间件应用于
    Passport::routes()
    ,在我的例子中,它位于
    AuthServiceProvider

  • 你都准备好了

    这样做的逻辑方法是触发一个事件。Passport已具有创建访问或刷新令牌时的事件。我不熟悉细节,因为我以前没有使用过Passport,但我倾向于在Passport中找到处理身份验证尝试的控制器,编写一个扩展它并在适当时间触发新事件的控制器,然后用它代替默认的授权控制器。我开始考虑使用事件的想法,但假设事件基于Oauth访问令牌模型。这意味着只有在访问或修改模型时才会触发事件。在身份验证尝试失败时不会发生此行为。我会根据你的建议更好地研究控制器并跟进。谢谢
    <?php
    
    namespace App\Http\Middleware;
    
    use App\AccessLog;
    use App\User;
    use Carbon\Carbon;
    use Closure;
    use Illuminate\Support\Facades\Hash;
    
    
    class AccessLogMiddleware
    {
        public function handle($request, Closure $next)
        {
            if ($request->route()->getName() === 'passport.token'){ //this the route name of the API endpoint to get the token
                $accessLog = new AccessLog([
                    'username' => $request->username,
                    'ip_address' => $request->getClientIp(),
                    'login_time' => Carbon::now(),
                ]);
    
                $user = User::query()->where([
                    'username' => $request->username,
                ])->first();
    
                if ($user) {
                    $accessLog->is_valid_username = 1;
                    if (Hash::check($request->password, $user->password)){
                        $accessLog->is_valid_password = 1;
                    }
                };
    
                $accessLog->save();
            }
            return $next($request);
        }
    }
    
    protected $routeMiddleware = [
         'access_log' => \App\Http\Middleware\AccessLogMiddleware::class,
         ....
    ]
    
    Passport::routes(null, ['middleware' => 'access_log']);