Laravel API 的中间件授权
Laravel Middleware Auth for API
我目前正在开发具有 API 的应用程序,我希望可以通过中间件访问该应用程序,该中间件将检查用户是否使用 Laravel 的默认 Auth 中间件和 Tymone 的 JWT.Auth 基于令牌的中间件,因此请求可以通过任何一种方式进行身份验证。
我可以想出如何拥有其中之一但不能同时拥有两者,我该怎么做?我在想我需要创建一个使用这些现有中间件的自定义中间件吗?
我正在使用Laravel 5.1
谢谢
我认为您可以在 routes.php 文件中使用 Route::group
并在数组中定义要使用的中间件。
Route::group(['middleware' => ['auth', 'someOtherMiddleware']], function()
{
Route::get('api/somethinglist', function(){
return App\Something::all();
});
});
如果我没记错的话,该路由组中定义的所有路由都会根据您在数组中指定的中间件进行检查。
事实证明我确实需要制作自己的中间件,这比我想象的要容易:
<?php
namespace App\Http\Middleware;
use Auth;
use JWTAuth;
use Closure;
class APIMiddleware {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next) {
try {
$jwt = JWTAuth::parseToken()->authenticate();
} catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
$jwt = false;
}
if (Auth::check() || $jwt) {
return $next($request);
} else {
return response('Unauthorized.', 401);
}
}
}
然后我在我的 api 路由组上使用这个中间件,就像在内核中注册后一样:
Route::group(['prefix' => 'api', 'middleware' => ['api.auth']], function() {
我目前正在开发具有 API 的应用程序,我希望可以通过中间件访问该应用程序,该中间件将检查用户是否使用 Laravel 的默认 Auth 中间件和 Tymone 的 JWT.Auth 基于令牌的中间件,因此请求可以通过任何一种方式进行身份验证。
我可以想出如何拥有其中之一但不能同时拥有两者,我该怎么做?我在想我需要创建一个使用这些现有中间件的自定义中间件吗?
我正在使用Laravel 5.1
谢谢
我认为您可以在 routes.php 文件中使用 Route::group
并在数组中定义要使用的中间件。
Route::group(['middleware' => ['auth', 'someOtherMiddleware']], function()
{
Route::get('api/somethinglist', function(){
return App\Something::all();
});
});
如果我没记错的话,该路由组中定义的所有路由都会根据您在数组中指定的中间件进行检查。
事实证明我确实需要制作自己的中间件,这比我想象的要容易:
<?php
namespace App\Http\Middleware;
use Auth;
use JWTAuth;
use Closure;
class APIMiddleware {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next) {
try {
$jwt = JWTAuth::parseToken()->authenticate();
} catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
$jwt = false;
}
if (Auth::check() || $jwt) {
return $next($request);
} else {
return response('Unauthorized.', 401);
}
}
}
然后我在我的 api 路由组上使用这个中间件,就像在内核中注册后一样:
Route::group(['prefix' => 'api', 'middleware' => ['api.auth']], function() {