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

Posted

技术标签:

【中文标题】如何使用 Laravel Passport (5.3) 记录身份验证尝试【英文标题】:How to log authentication attempt using Laravel Passport (5.3) 【发布时间】:2018-04-16 11:12:16 【问题描述】:

我们有一个通过 Ang 1.6.5 前端使用 Laravel REST API 后端的网络应用。

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

我似乎不知道如何挂钩到 Passport 的身份验证过程。

我尝试了一些自定义中间件,也是自定义提供程序。两者都不起作用,尽管它可能是实现。

这里的正确方法是什么?

谢谢。

【问题讨论】:

执行此操作的合乎逻辑的方法是触发事件。 Passport 已经有创建访问或刷新令牌时的事件。我不熟悉细节,因为我以前没有使用过 Passport,但我倾向于在 Passport 中找到处理身份验证尝试的控制器,编写一个扩展它的控制器并在适当的时间触发新事件,然后使用它代替默认的授权控制器。 我开始检查使用事件的想法,但假设事件是基于 Oauth 访问令牌模型的。这意味着只有 模型被访问或修改时才会触发事件。此行为不会在身份验证尝试失败时发生。我会根据您的建议更好地研究控制器并跟进。谢谢! 【参考方案1】:

我整个晚上都在想如何在 Laravel 6 中自己做到这一点。

    我创建了一个名为AccessLogMiddleware 的中间件
<?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);
    

    注册到Http\Kernel
protected $routeMiddleware = [
     'access_log' => \App\Http\Middleware\AccessLogMiddleware::class,
     ....
]
    将中间件应用到Passport::routes(),在我的例子中是AuthServiceProvider
Passport::routes(null, ['middleware' => 'access_log']);

一切就绪!

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于如何使用 Laravel Passport (5.3) 记录身份验证尝试的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4建站06--API 认证系统 Passport

Laravel 5.3 + Passport:总是未经身份验证的错误

Laravel 5.7 在播种机中使用 Passport 进行测试

Laravel 5.8 验证在使用 Passport 失败后返回首页

Vue 组件未显示 - Passport 实现 Laravel 5.4

Laravel 5.3 Passport API 在 Postman 中使用个人访问令牌未经身份验证