Laravel 5.2:相同路线上的会话和令牌守卫

Ale*_*eev 1 php api authorization laravel laravel-5.2

我们有会议守卫,这就足够了.

现在我们需要通过令牌(在标题或GET参数中)和相同路线上的会话添加授权.

通过令牌授权必须是无状态的.

UPD:首先,我们考虑创建dubplicate路由.一个用于会话,一个用于令牌

// api token auth
// url: /api/test
Route::group(['middleware' => ['web', 'auth:api'], 'prefix' => 'api', 'as' => 'api.'], function () {
    Route::resource('test', 'TestController');
    // 50+ routes
});

// session auth
// url: /test
Route::group(['middleware' => ['web', 'auth']], function () {
    Route::resource('test', 'TestController');
    // 50+ routes
});
Run Code Online (Sandbox Code Playgroud)

但这不是我们想要的,因为网址不同.

也许有人知道如何解决这个问题?

小智 6

创建新的中间件AuthenticateWithToken:

class AuthenticateWithToken
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     *
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (($user = Auth::guard('api')->user())) {
            Auth::setUser($user);
        }

        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

在Http/Kernel.php中声明它:

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    // ...
    'auth.api' => \App\Http\Middleware\AuthenticateWithToken::class,
    // ...
];
Run Code Online (Sandbox Code Playgroud)

并在routes.php中的默认'auth'中间件之前添加它:

Route::group(['middleware' => ['web', 'auth.api', 'auth']], function () {
    Route::resource('test', 'TestController');
    // 50+ routes
});
Run Code Online (Sandbox Code Playgroud)