OAuth:生成/重用令牌的正确方法

时间:2020-06-24 20:37:17

标签: php laravel oauth

这是当用户提供正确的凭据时我如何管理OAuth身份验证的方法:

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

我尝试使用默认的Laravel身份验证(护照),该身份验证使用OAuth。我遇到的问题是,每次用户连接时,它都会在oauth_access_token表中创建一个新条目。

推荐的方法是什么?

让它像这样增长,在此表中有nb_user * nb_authentications个条目吗?

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

1 个答案:

答案 0 :(得分:1)

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

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

因此,处理此问题的首选方法是,一旦创建了新的密钥访问令牌,我们就会删除为用户创建的先前访问令牌。

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

EventServiceProvider类中,找到$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不同。当此数据位于数据库中时,这意味着用户拥有旧的访问令牌,我们将其删除。

侦听器类文件的内容如下:

<?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();
    }
}

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