首页 文章

Laravel Passport API多个中间件

提问于
浏览
0

甚至可以在一条路线中拥有多个中间件 . 现在我有我的网络应用程序使用auth的中间件制作ajax请求,这是在auth:net默认

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

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

    在处理此请求之前,请验证用户是否通过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(){
    
    });
    

    这是我们将在 both 组中的路线:

    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);
                }
            }
        }
    }
    

    Note 我输入的内容无法访问实际代码,因此 $user->getFillable() 可能会返回一个集合,要求您将其转换为数组 . 如果是这种情况,只需将 $user->getFillable()->toArray() 链接到最后 .

    这样做的神奇之处在于,如果进程成功请求,您可以使用 .done() 在promise对象上捕获它 . 如果失败,那么你将收到 422 Unprocessable Entity in Request 消息,这将在promise对象上触发 .fail() .

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

    <?php
    
    namespace App\Http\Controllers\Api;
    
    class UserController extends App\Http\Controllers\UserController {
    
    }
    

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

    希望这会有所帮助 .

相关问题