Laravel 5.6 - Как получить auth () -> user () или $ response-> user () в контроллере API? - PullRequest
0 голосов
/ 06 июня 2018

В api.php файле маршрутов, указанном ниже, есть публичные маршруты и частные маршруты:

Route::group(['namespace' => 'API'], function() {

     // Public routes (auth not required)
     Route::group([], function() {
         Route::get('/testauth1', 'TestController@testauth1');
         // more public routes...
     });

     // Private routes (auth required)
     Route::group(['middleware' => 'auth:api'], function() {
         Route::get('/testauth2', 'TestController@testauth2');
         // more private routes...
     });

});

В TestContoller это 2 метода, вызываемых выше:

class TestController extends Controller {

    public function testauth1(\Request $request) {
      // return auth()->user(); // does not return user
      return $request->user(); // does not return user
    }

    public function testauth2() {
      return auth()->user(); // returns user
    }

}

Поскольку у группы частных маршрутов есть промежуточное ПО auth:api, мы обеспечим аутентификацию пользователя, проверив токен, указанный в заголовке Authorization Bearer.Только при наличии действующего токена приватные маршруты будут предоставлены аутентифицированному пользователю.Вот почему TestController@testauth2 корректно возвращает пользователя авторизации.

Теперь любой может получить доступ к общедоступным маршрутам с токеном или без него.Если в заголовке Authorization Bearer не указан токен, у нас не будет аутентифицированного пользователя, что имеет смысл.Вот почему TestController@testauth1 не возвращает аутентифицированного пользователя.Однако, когда вошедший в систему пользователь получает доступ к /testauth1 общедоступному маршруту, он предоставляет свой токен в заголовке Authorization Bearer и поэтому должен быть возвращен в TestController@testauth1, если не с auth()->user(), по крайней мере с $request->user(), но мы можем 'Кажется, что доступ к пользователю с помощью предоставленного им токена в этом методе невозможен.

Есть идеи, как получить доступ к действительному пользователю токена во всех общедоступных методах маршрутизации?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Передайте защиту api в качестве параметра для выборки авторизованного пользователя без промежуточного программного обеспечения, защищающего запрос.

$request->user('api');

// Or

auth('api')->user();
0 голосов
/ 06 июня 2018

Вы ссылаетесь на Request из корневого пространства имен: \Request.Вместо этого вы должны ссылаться на класс Illuminate\Http\Request.

. Вы должны удалить \ из вашего параметра и добавить следующую строку в ваш импорт.

use Illuminate\Http\Request;

В качестве альтернативы, вы также можете ссылаться на класс запроса непосредственно в вашем методе:

class TestController extends Controller {

    public function testauth1(Illuminate\Http\Request $request) {
        return $request->user();
    }

    public function testauth2() {
        return auth()->user(); // returns user
    }

}

Вспомогательный метод auth() или Auth Фасад доступен по всему миру,Это не зависит от запроса, к которому вы пытаетесь получить доступ.То же самое касается помощников request() и Request::, я верю.В случае, если вы даете, вы ссылаетесь на неправильный экземпляр запроса, что дает неожиданный результат.

...