2

この 2 つのイベント リスナーを my に追加しました。EventServiceProvider

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'Laravel\Passport\Events\AccessTokenCreated' => [
        'App\Listeners\RevokeOldTokens',
    ],

    'Laravel\Passport\Events\RefreshTokenCreated' => [
        'App\Listeners\PruneOldTokens',
    ],
];

そして、私の AuthServiceProvider には次のものがあります。

 public function boot()
    {
        $this->registerPolicies();

        Passport::routes();
        passport::$revokeOtherTokens;
        passport::$pruneRevokedTokens;
        Passport::tokensExpireIn(Carbon::now()->addDays(1));
        Passport::refreshTokensExpireIn(Carbon::now()->addDays(2));

    }

パスポートに他のすべてのユーザーアクセストークンを取り消してから、それらが取り消された場合は剪定したいと思います。しかし、何も起こっていません。ポストマンにアクセストークンをリクエストするたびに、データベースにいくつかのアクセストークンがある間に新しいアクセストークンが表示されます。

4

3 に答える 3

32

私はこの方法で問題を解決しました: Step1 -EventServiceProvider作成されたアクセストークンへのパスを変更し、作成されたトークンを更新する必要があります:

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

        'Laravel\Passport\Events\RefreshTokenCreated' => [
            'App\Listeners\PruneOldTokens',
        ],
    ];

Step2- この 2 つのリスナー イベントを生成します。

php artisan event:generate

Step3-変更AccessTokenCreated&RefreshTokenCreatedイベント ハンドル メソッド:

RevokeOldTokens クラス:

namespace App\Listeners;

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

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

    /**
     * Handle the event.
     *
     * @param  AccessTokenCreated  $event
     * @return void
     */
    public function handle(AccessTokenCreated $event)
    {


        DB::table('oauth_access_tokens')
            ->where('id', '<>', $event->tokenId)
            ->where('user_id', $event->userId)
            ->where('client_id', $event->clientId)
            ->update(['revoked' => true]);


    }
}

PruneOldTokens クラス:

namespace App\Listeners;

use Laravel\Passport\Events\RefreshTokenCreated;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use DB;

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

    /**
     * Handle the event.
     *
     * @param  RefreshTokenCreated  $event
     * @return void
     */
    public function handle(RefreshTokenCreated $event)
    {

        DB::table('oauth_refresh_tokens')
            ->where('id', '<>', $event->refreshTokenId)
            ->where('access_token_id', '<>', $event->accessTokenId)
            ->update(['revoked' => true]);

    }
}

この手順の後、プロジェクトにリクエストを送信すると、トークンがチェックされ、別のトークンがある場合はそれが取り消され、未承認になります。

于 2016-11-23T10:15:28.337 に答える
1

パスポート作品に見つけさせる重要なものを見逃した可能性があります。

1- config/app.php Laravel\Passport\PassportServiceProvider::class の providers 配列に Passport サービス プロバイダーを登録します。

1- Laravel\Passport\HasApiTokens トレイトを App\User モデルに追加する必要があります 2- config/auth.php 構成ファイルで、API 認証ガードのドライバー オプションをパスポートに設定する必要があります

これをチェックして ください http://www.snippetcase.com/snippet/61/API+Authentication+(Passport)+Laravel+5.3

于 2016-11-23T09:15:29.573 に答える
0

私は同じ質問をしていました!私も同じことをしました:

    $id = $request->user()->id ?? -1;
    $token = Token::where('user_id', $id)->get();

    foreach ($token as $t) {
        $tokenRepository = app(TokenRepository::class);
        $refreshTokenRepository = app(RefreshTokenRepository::class);

        if (isset($t)) {
            $tokenRepository->revokeAccessToken($t->id);
            $refreshTokenRepository->revokeRefreshTokensByAccessTokenId($t->id);
        }

        RefreshToken::where('access_token_id', $t->id)->delete();
        $t->delete();
    }
于 2021-11-17T05:53:26.337 に答える