hhxsv5 / laravel-s

LaravelS is an out-of-the-box adapter between Laravel/Lumen and Swoole.
MIT License
3.84k stars 475 forks source link

jwt refresh token时不能正确返回当前用户的token #142

Closed gelove closed 5 years ago

gelove commented 5 years ago

| PHP | 7.2.17 | | Swoole | 4.2.13 | | LaravelS | 3.4.4 | | Laravel Framework [local] | Lumen (5.7.8) (Laravel Components 5.7.*)

jwt refresh token时会返回最后一个登录用户的token,而不是当前用户的token 原因是一些jwt单例中包含脏数据,变通方法是

// 使用login方法来获得新的token
$token = auth()->login(auth()->user());

或者

<?php
namespace Hhxsv5\LaravelS\Illuminate\Cleaners;

use Illuminate\Container\Container;
use Illuminate\Support\Facades\Facade;

class JWTCleaner implements CleanerInterface
{
    protected $instances = [
//        'tymon.jwt',  // 注销此行
        'tymon.jwt.auth',
        'tymon.jwt.parser',
        'tymon.jwt.claim.factory',
        'tymon.jwt.manager',
    ];

    public function clean(Container $app, Container $snapshot)
    {
        foreach ($this->instances as $instance) {
            $app->forgetInstance($instance);
            Facade::clearResolvedInstance($instance);
        }
    }
}

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [];

    /**
     * Boot the authentication services for the application.
     */
    public function boot()
    {
        parent::boot();

        Event::listen('laravels.received_request', function ($request, $app) {
            // 添加两行
            app('tymon.jwt')->unsetToken();
            auth()->setRequest($request);
        });
    }
}

方法不够优雅,如有更好的方法,请告知,谢谢!

hhxsv5 commented 5 years ago

JWTCleaner不行吗?

gelove commented 5 years ago

JWTCleaner不行吗?

refresh方法会返回当前work进程最后一个登录的用户的token,login方法可以正确返回当前用户token。 就是说 jwt 单例保存了最后一个登录用户的 token。

可以看一下 JWTGuard 中的 requireToken 的方法

hhxsv5 commented 5 years ago

JWTCleaner中清理了JWTGuard实例,每次请求会重新生成,为什么要注释掉'tymon.jwt'

gelove commented 5 years ago
Hhxsv5\LaravelS\Illuminate\Cleaners\AuthCleaner::class, 
Hhxsv5\LaravelS\Illuminate\Cleaners\JWTCleaner::class,

同时使用这两个Cleaner可以解决这个问题

hhxsv5 commented 5 years ago

嗯,JWT也是基于Laravel的Auth,都需要清理。

gelove commented 5 years ago

嗯,JWT也是基于Laravel的Auth,都需要清理。

Hhxsv5\LaravelS\Illuminate\Cleaners\AuthCleaner::class,    // If you use the authentication/passport in your project, please uncomment this line

配置文件里的注释有歧义啊 = =!

hhxsv5 commented 5 years ago

JWT使用了Laravel的Auth呀,没毛病吧。

gelove commented 5 years ago

JWT使用了Laravel的Auth呀,没毛病吧。

对作者来说是没毛病,对使用者来说有。 你这样写我只会关注到passport。 建议尽量在文档里描述清楚jwt需要打开两个Cleaner。

RussellCao824 commented 4 years ago
Hhxsv5\LaravelS\Illuminate\Cleaners\AuthCleaner::class, 
Hhxsv5\LaravelS\Illuminate\Cleaners\JWTCleaner::class,

同时使用这两个Cleaner可以解决这个问题

很棒