Обновляем модель User.
Для начала нужно имплементировать контракт Tymon\JWTAuth\Contracts\JWTSubject
, который обязует реализовать два метода getJWTIdentifier()
и getJWTCustomClaims()
.
namespace App; use Tymon\JWTAuth\Contracts\JWTSubject; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable implements JWTSubject { use Notifiable; // Rest omitted for brevity /** * Get the identifier that will be stored in the subject claim of the JWT. * * @return mixed */ public function getJWTIdentifier() { return $this->getKey(); } /** * Return a key value array, containing any custom claims to be added to the JWT. * * @return array */ public function getJWTCustomClaims() { return []; } }
В файле config/auth.php
переключаем драйвер guards api на jwt
'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], ... 'guards' => [ 'api' => [ 'driver' => 'jwt', 'provider' => 'users', ], ],
Создаем следующие маршруты:
Route::get('auth/login', 'AuthController@login'); Route::get('auth/logout', 'AuthController@logout'); Route::get('auth/token', 'AuthController@token'); Route::get('auth/me', 'AuthController@me'); Route::get('auth/tokenid', 'AuthController@tokenId');
Контроллер AuthController:
namespace App\Http\Controllers; use Auth; use App\Http\Controllers\Controller; class AuthController extends Controller { public function login() { $credentials = request(['email', 'password']); if (! $token = auth('web')->attempt($credentials)) { return response()->json(['error' => 'Unauthorized'], 401); } return $this->respondWithToken($token); } public function me() { return response()->json(auth('web')->user()); } public function token() { return response()->json(auth('web')->user()->getRememberToken()); } public function tokenId(){ if (! $token = auth('api')->tokenById(Auth::user()->id)) { return response()->json(['error' => 'Unauthorized'], 401); } return $this->respondWithToken($token); } public function logout() { auth()->logout(); return response()->json(['user'=>'logout']); } protected function respondWithToken($token) { return response()->json([ 'access_token' => $token, 'token_type' => 'bearer', 'expires_in' => auth('api')->factory()->getTTL() * 60 ]); } }
Прежде чем переходить к тестированию, иногда требуется обнулить кэш и маршруты:
php artisan config:cache php artisan route:clear php artisan cache:clear