LaravelでのAPIの認証は、こちをご参照ください。
→ LaravelでのJWT認証
Laravelの認証は、config/auth.php
にのguardにて設定しますが、defaultをapiに設定するとwebでの認証ができなくなってしまいます。
'defaults' => [
'guard' => 'api', // ← ここです。
'passwords' => 'users',
],
一つのLaravelプロジェクトで、webとapiの両方を実装したいときの対応になります。
Laravelではauth()
や、Auth::login()
などで使用する認証は、guardのデフォルトの方となるようです。
デフォルト以外のものを使うときは、Auth::guard('[guard名]')->login()
とguardを指定して使用します。
そうすることで、webとapiの両立を実現します。
defaultの設定
guardのdefaultはwebにしておきます。
make:authのコントローラーもそのまま使えるので便利です。
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
API側の認証のコントローラにてguardを指定する
実装例のAuthControllerは、LaravelでのJWT認証で使用したものです。
Quick startで紹介されているものから少しだけ修正しています。
それに対して、上記のようにauth()
をAuth::guard('api')
に変更します。
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
class AuthController extends Controller
{
/**
* Create a new AuthController instance.
*
* @return void
*/
public function __construct()
{
// $this->middleware('auth:api', ['except' => ['login']]);
}
/**
* Get a JWT via given credentials.
*
* @return \Illuminate\Http\JsonResponse
*/
public function login()
{
$credentials = request(['email', 'password']);
if (! $token = Auth::guard('api')->attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $this->respondWithToken($token);
}
/**
* Get the authenticated User.
*
* @return \Illuminate\Http\JsonResponse
*/
public function me()
{
return response()->json(auth()->user());
}
/**
* Log the user out (Invalidate the token).
*
* @return \Illuminate\Http\JsonResponse
*/
public function logout()
{
Auth::guard('api')->logout();
return response()->json(['message' => 'Successfully logged out']);
}
/**
* Refresh a token.
*
* @return \Illuminate\Http\JsonResponse
*/
public function refresh()
{
try {
return $this->respondWithToken(Auth::guard('api')->refresh());
} catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
return response()->json(['error' => 'Unauthorized'], 401);
}
}
/**
* Get the token array structure.
*
* @param string $token
*
* @return \Illuminate\Http\JsonResponse
*/
protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => Auth::guard('api')->factory()->getTTL() * 60
]);
}
}
認証後のコントローラー
auth()->user()
は、変更しなくてもユーザー情報の取得はできているようなので、この認証を使って作成するAPI側は特にguardの指定はしなくてもよさそうです。