OAuth:generate/reuse 令牌的正确方法

OAuth: Proper way to generate/reuse token

这是我在用户提供正确凭据时管理 OAuth 身份验证的方式:

    protected function authenticated(Request $request, User $user)
    {
        return response()->json([
            'token' => $user->createToken('my_app')->accessToken
        ]);
    }

我尝试使用默认的 Laravel 身份验证(护照),它使用 OAuth。我遇到的问题是每次用户连接时,它都会在 oauth_access_token table.

中创建一个新条目

推荐的方法是什么?

让它长成这样,在这个 table 中有 nb_user * nb_authentications 个条目?

或者我应该检查用户在验证身份时是否已经拥有有效令牌以将令牌还给他,或者在创建新令牌时删除其他令牌?

用户和客户端有责任保存他的访问令牌代码,客户端应用程序必须制定适当的机制并将密钥存储在安全的地方。

此外,生成密钥时必须使用安全连接,例如使用 https。 稍后,每当请求登录页面时为用户生成访问令牌将被视为安全漏洞,因为数据库将包含许多有效且可以使用且难以跟踪的访问令牌。

因此,处理此问题的首选方法是在创建新密钥访问令牌后立即删除为用户创建的先前访问令牌。

Laravel 7[See the official documentation]中推荐的方式是使用事件跟踪生成,删除旧的:

EventServiceProvider class 中,找到 $listen 数组并附加 Passport 侦听器:

'Laravel\Passport\Events\AccessTokenCreated' => [
            'App\Listeners\RevokeOldTokens',
        ],

然后我们执行下面的artisan命令来生成监听器:

php artisan event:generate

然后在 App\Listeners\ 文件夹和 handle 方法中找到侦听器,放入以下代码:

Token::where([
            ['user_id', $event->userId],
            ['id', '<>', $event->tokenId]
        ])->delete();

通过编写上面的代码,我们告诉Laravel通过他的用户ID找到用户访问令牌,他创建了一个新的访问令牌,并且访问令牌ID与新的访问令牌不同刚刚生成的ID。当此数据在数据库中时,意味着用户有旧的访问令牌,我们将其删除。

监听class文件内容如下:

<?php

namespace App\Listeners;

use Laravel\Passport\Events\AccessTokenCreated;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Laravel\Passport\Token;

class RevokeOldTokens
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  AccessTokenCreated  $event
     * @return void
     */
    public function handle(AccessTokenCreated $event)
    {
        Token::where([
            ['user_id', $event->userId],
            ['id', '<>', $event->tokenId]
        ])->delete();
    }
}

现在尝试生成一个新的用户访问代码,您会注意到以前的访问令牌已从数据库中删除。