Laravel Passport API多个中间件

时间:2016-11-27 19:15:59

标签: laravel api routes middleware laravel-passport

甚至可以在一条路线中拥有多个中间件。现在我有我的网络应用程序使用auth的中间件发出ajax请求,这是在auth:web

的默认值
Route::post('/user/postAuthUserInfoAjax', [
  'uses' => 'UserController@postAuthUserInfoAjax',
  'middleware' => ['auth'],
]);

我还想要我的移动应用程序,它具有API访问令牌(使用laravel passport)来验证用户是否能够访问这些相同的路由。为了做到这一点,我只需指定' auth:api'在我的中间件中。

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

唯一的问题是我无法指定多个中间件。我可以使用' auth:api'或者' auth:web'但不是两个。我想我可以为每个ajax请求设置两个路由,一个用于web应用,另一个用于api请求,但如果我只能使用一个路由,那将会好得多。

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

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

1 个答案:

答案 0 :(得分:0)

这不起作用,因为您说的如下:

  

在处理此请求之前,请验证用户是否通过Web提供程序进行了身份验证,但是,它们也必须通过我的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', 'UserController@info');

然后基本控制器看起来像这样:

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消息,这将在promise对象上触发.fail()

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

<?php

namespace App\Http\Controllers\Api;

class UserController extends App\Http\Controllers\UserController {

}

虽然您必须进行一些逻辑重复,但为了清晰起见,在整个应用程序堆栈中保持这种分离级别非常重要。如果您仍需要更改任一路线的内容,此方法仍然允许您进行一定程度的精细控制,但为您提供了工作基础。

希望这有帮助。