如何使用FOSOAuthServerBundle从数据库中清除所有过期的令牌

如你所知, 每次执行对应用程序/ oauth路由的请求(已实现FOSOAuthServerBundle)时, 你都将在数据库中的access_token表中注册一个令牌(或根据auth_code表中请求的grant_type参数) )。
在他们的头脑中, 开发人员不希望数据库中有无用的记录, 因此我们需要从过期的oauth令牌中清除数据库。有两种方法可以从数据库中清除令牌:执行捆绑软件的clean命令或复制相同的逻辑, 然后直接从控制器(或服务)中执行。
FOSOAuthServer捆绑软件已经实现了清洁命令, 可以为你解决问题。只需从命令行执行以下命令:

$ php app/console fos:oauth-server:clean

【如何使用FOSOAuthServerBundle从数据库中清除所有过期的令牌】你将得到类似于以下内容的输出:
如何使用FOSOAuthServerBundle从数据库中清除所有过期的令牌

文章图片
你也可以使用与命令相同的方式, 从symfony控制器清除所有过期的令牌。检索服务, 并按以下方式访问deleteExpired函数:
< ?phpnamespace myapp\myBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class AdminController extends Controller{    public function cleartokensAction(){            $services = array('fos_oauth_server.access_token_manager'=> 'Access token', 'fos_oauth_server.refresh_token_manager' => 'Refresh token', 'fos_oauth_server.auth_code_manager'=> 'Auth code', );                 $info = array(); foreach ($services as $service => $name) {/** @var $instance TokenManagerInterface */// if you're not from a controller, you need to inject the container and the use the get option$instance = $this-> get($service); if ($instance instanceof TokenManagerInterface || $instance instanceof AuthCodeManagerInterface) {$result = $instance-> deleteExpired();                             array_push($info, array(                                    'serviceName' => $name,                                     'numberDeletedTokens' => $result                                )); }}                var_dump($info); // dump an array with the same structure as the shown in the first image.// handle the response by yourself, otherwise this will throw error.        }}

当然, 你需要保护此功能, 以防止没有适当权限(无管理员)的用户无法使用此功能。
如果要自动执行此任务, 则可以在操作系统中创建crontab, 以在需要时执行命令(或在控制器中提供代码的php文件)。玩得开心 !

    推荐阅读