如何为经过身份验证的用户和 non-authenticated 用户提供路由

How to have a route for both authenticated users and non-authenticated users

我对 auth:api 中间件有疑问! 当我为 non-authenticated 用户定义这样的路由时,我们有一个经过身份验证的用户和 non-authenticated 用户都可以访问的请求:

Route::post('{user}/leads', 'UsersController@getContact');

来宾用户请求此路由时一切正常。 是,我可以使用 $request->user();

访问用户

但是如果使用 bearer header 传递令牌并使用 $request->user() 获取用户当然是行不通的!因为我们没有在这条路线上使用 auth:api,如果我们这样做了,我们就不能用访客用户访问这条路线! 所以我找不到一种方法来为两个经过身份验证的用户定义一条路由,如果用户经过身份验证,我们会得到 $request->user() 和 none 经过身份验证的用户也可以访问该路由!

提前致谢。

如果您希望路由仅对经过身份验证的用户可见,您可以将所有路由放入默认由 laravel 提供的 auth 中间件中,您可以这样放置:-

enter code here
Route::group(['middleware' => ['auth']], function () {
Route::post('{user}/leads', 'UsersController@getContact');
});

并且如果你想显示认证用户和非认证用户的路由 你可以简单地放在中间件外面 喜欢那个:-

Route::match(['get', 'post'], '/cms-page','CmsController@cms');

希望你明白

这是因为 Auth 使用默认的 web 守卫。您必须手动检查 api 守卫:

$user = Auth::user() ?? Auth::guard("api")->user();

那么你不使用任何 auth 中间件。如果用户是访客,$user 将是 null,否则应设置。

我找到了一种方法,我刚刚写了这个:

$middleware = ['api'];
if (\Request::header('Authorization')) 
   $middleware = array_merge(['auth:api']);
Route::group(['prefix' => 'v1', 'namespace' => 'Api', 'middleware' => $middleware], function () {
    //routes here
});

在 api.php 路由文件中,它工作正常。 谢谢

我使用的解决方案是为 auth 创建一个新的中间件:

public function handle($request, Closure $next, ...$guards)
{

    try
    {
        $this->authenticate($request, $guards);
    }
    catch(AuthenticationException $ex)
    {

    }

    return $next($request);
}

在我的路线底部我做了:

Route::middleware('auth_optional:api')->group(function () {
    Route::get('services', [ServiceController::class,'index']);
});

这样,如果需要身份验证,它将分配正确的用户来请求,否则它将以访客身份继续。我确实需要做一个 $request->user() === null 来确保用户是 guest

我想使用经过身份验证的用户和 non-authenticated 用户的其他路由, 但是关于这个主题,我添加了一种简单的方法:

在控制器的 __constructor 函数中添加这些行:

$authorizationHeader = \request()->header('Authorization');
        if(isset($authorizationHeader)) {
            $this->middleware('auth:api');
        }

但我并没有将这种方式作为最佳实践,这违反了单一职责原则。