2016-11-27 82 views
0

甚至有可能在一条路线上有多个中间件。现在,我有我的身份验证的中间件,这是在身份验证默认的Web应用程序,让AJAX请求:网络Laravel Passport API多中间件

Route::post('/user/postAuthUserInfoAjax', [ 
    'uses' => '[email protected]', 
    'middleware' => ['auth'], 
]); 

我也希望我的移动应用程序,其中有一个API访问令牌(使用laravel护照)认证一个用户能够访问那些相同的路由。为了做到这一点,我只是在我的中间件中指定了'auth:api'。

Route::post('/user/postAuthUserInfoAjax', [ 
    'uses' => '[email protected]', 
    'middleware' => ['auth:api'], 
]); 

唯一的问题是我不能指定多个中间件。我可以使用'auth:api'或'auth:web',但不能同时使用。我想我可以为每个ajax请求提供两个路由,一个用于web应用,另一个用于api请求,但如果我只能使用一个路由,则会更好。

我试过了,但它不起作用。有谁知道如何做到这一点?它甚至有可能

Route::post('/user/postAuthUserInfoAjax', [ 
    'uses' => '[email protected]', 
    'middleware' => ['auth:web','auth:api'], 
]); 

回答

0

,因为你说这是行不通的以下内容:

处理这个请求之前,验证用户通过网络提供身份验证,但是,他们也必须通过我的api提供商进行身份验证。

App 
| 
---- Http 
    | 
    ---- Controllers 
      | 
      ---- UserController (this will be our base) 
      ---- API 
       | 
       ---- UserController (will extend the base) 
      ---- Web 
       | 
       ---- UserController (will extend the base) 

那么你应该也相应成立了航线群体:你可以接近这只是有两个控制器,但在已经出炉的功能扩展基本控制器

一种方式

//Your "web provider" authenticated routes 
Route::group(['middleware' => ['auth:web'] 'namespace' => 'Web', function(){ 

}); 

那么对于您的API请求:

//your "api provider" authenticated routes 
Route::group(['middleware' => ['auth:api'], 'namespace' => 'API', function(){ 

}); 

这是路线,我们就会把里面我们组的两个

Route::post('user/info', '[email protected]'); 

然后主控制器应该是这个样子:

class UserController extends App\Http\Controller { 

    /** 
    * Update the specified User Resource 
    * 
    * @param Illuminate\Http\Request $request 
    * @param App\User $user 
    * 
    * @returns mixed 
    */ 
    public function update(Illuminate\Http\Request $request, App\User $user) 
    { 
     if ($request->ajax()) { 
      try { 
       DB::transaction(function() use ($request, $user) { 
        $user->update($request->only($user->getFillable())); 
       }); 

       DB::commit(); 
      } catch (\Exception $e){ 
       DB::rollback(); 
       return response()->json($e->getMessage(), 422); 
      } 
     } 
    } 
} 

注意我打字这个无法访问真实代码,因此$user->getFillable()可能会返回一个集合,要求您将其转换为数组。如果是这样的话,只需链接$user->getFillable()->toArray()即可。

其中的神奇之处在于,如果进程请求成功,您可以在promise对象上捕获.done()。如果失败,您将收到一个422 Unprocessable Entity in Request消息,这将触发诺保对象上的.fail()

现在,只需要从你的API/Web UserControllers的扩展此基础UserController

<?php 

namespace App\Http\Controllers\Api; 

class UserController extends App\Http\Controllers\UserController { 

} 

虽然你必须做逻辑的一些重复,以保持整个为清楚您的应用程序堆栈分离这一水平是非常重要的。如果你仍然需要改变任何一条路径的东西,这个方法仍然会允许你进行细粒度控制,但是给你一个工作的基础。

希望这会有所帮助。

+0

现在它可以工作,如果我只有一个控制器和两个不同中间件的路由。所以我不需要有一个基础控制器,然后将它扩展到另外两个不需要的控制器。我想我只是在寻找一种不必复制路线的方法,我可以做一些类似'middleware'=> ['auth:web || auth:api']的路线 –