2017-01-06 8 views
2

클라이언트가 Authorization=Bearer <access_token>을 보내는 일반 끝점에서 'middleware' => 'auth:api'을 사용하면 인증이 정상적으로 작동합니다.헤더 대신에 쿼리 문자열에 액세스 토큰이있는 Laravel Passport를 사용하여 요청을 인증하려면 어떻게해야합니까?

하지만 인증 헤더가없는 평범한 이미지 다운로드 요청을 처리하기 위해 다음과 같은 쿼리 문자열에 액세스 토큰이 있습니다. GET /picture/my_picture.png?access_token=1234.

나는 나의 미들웨어에서이 같은 시도,하지만 난 요청에 헤더를 추가 할 수없는 것 : 이것은

if ($request->has('access_token')) { 
    // something like $request->header->set('Authorization', 'Bearer ' . $request->get('access_token')); 
} 

if ($this->auth->guard($guard)->guest()) { 
    // throw exception 
} 

을 할 수 있습니까? 어딘가에 다른 것을 가로 채거나 대체 할 수 있습니까?

답변

0

나는 당신의 앱에서 유사한 문제 했다 \ HTTP를 Kernal.php

\

등록하여 $ 미들웨어의 미들웨어 및 $ routeMiddleware

<?php 

namespace App\Http; 

use Illuminate\Foundation\Http\Kernel as HttpKernel; 

class Kernel extends HttpKernel 
{ 
    /** 
    * The application's global HTTP middleware stack. 
    * 
    * These middleware are run during every request to your application. 
    * 
    * @var array 
    */ 
    protected $middleware = [ 
     \App\Http\Middleware\AddHeaderAccessToken::class, 

     \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 
     \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, 
     \App\Http\Middleware\TrimStrings::class, 
     \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, 
    ]; 

    /** 
    * The application's route middleware groups. 
    * 
    * @var array 
    */ 
    protected $middlewareGroups = [ 
     'web' => [ 
      \App\Http\Middleware\EncryptCookies::class, 
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
      \Illuminate\Session\Middleware\StartSession::class, 
      // \Illuminate\Session\Middleware\AuthenticateSession::class, 
      \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
//   \App\Http\Middleware\VerifyCsrfToken::class, 
      \Illuminate\Routing\Middleware\SubstituteBindings::class, 
     ], 

     'api' => [ 
      'throttle:60,1', 
      'bindings', 
     ], 
    ]; 

    /** 
    * The application's route middleware. 
    * 
    * These middleware may be assigned to groups or used individually. 
    * 
    * @var array 
    */ 
    protected $routeMiddleware = [ 
     'addAccessToken' => \App\Http\Middleware\AddHeaderAccessToken::class, 
     'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 
     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
     'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 
     'can' => \Illuminate\Auth\Middleware\Authorize::class, 
     'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 
     'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 

     'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class, 
     'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class 
    ]; 
} 

미들웨어

<?php 

namespace App\Http\Middleware; 

use Closure; 

class AddHeaderAccessToken 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if ($request->has('access_token')) { 
     $request->headers->set('Authorization', 'Bearer ' . $request->get('access_token')); 
     } 
     return $next($request); 
    } 
}