以下のapi.php
routesファイルには、パブリックルートとプライベートルートがあります。
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
ヘッダーで提供されるため、少なくともauth()->user()
がない場合はTestController@testauth1
で返される必要があります$request->user()
を使用しますが、そのメソッドで提供されたトークンでユーザーにアクセスすることはできません。
すべてのパブリックルートメソッドで有効なトークンユーザーにアクセスする方法はありますか?
api
ガードをパラメーターとして渡して、ミドルウェアが要求を保護せずに許可ユーザーを取得します。
$request->user('api');
// Or
auth('api')->user();
ルート名前空間_\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
Facadeはグローバルに利用可能です。アクセスしようとしているリクエストに依存しません。 request()
および_Request::
_ヘルパーについても同じことが言えます。与えている場合、間違ったRequestインスタンスを参照しているため、予期しない結果が生じています。