installation de laravel jwt-auth et vérification
1. Utilisez composer pour installer jwt. , cmd dans le dossier du projet ;
composer require tymon/jwt-auth 1.0.* (Écrivez le numéro de version ici en fonction de vos propres besoins)
Installez jwt, reportez-vous à la documentation officielle https://jwt-auth.readthedocs.io/en/docs/laravel-installation/
2 Si la version de Laravel est inférieure à 5.4
Ouvrir la configuration/. app dans le répertoire racine. php
Ajouter TymonJWTAuthProvidersLaravelServiceProvider::class,
'providers' => [ ... TymonJWTAuthProvidersLaravelServiceProvider::class,]
3. un fichier de configuration jwt.php sous config
php artisan seller:publish --provider="TymonJWTAuthProvidersLaravelServiceProvider"
4. Générez une clé de chiffrement sous le fichier .env, telle que : JWT_SECRET =foobar.
php artisan jwt:secret
5. Écrivez le code suivant dans le modèle utilisateur
<?php namespace App\Model; use Tymon\JWTAuth\Contracts\JWTSubject; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable implements JWTSubject { // Rest omitted for brevity protected $table="user"; public $timestamps = false; public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomClaims() { return []; } }
6. Enregistrez deux Facade
config/ app.php.
'aliases' => [ ... // 添加以下两行 'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth', 'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory', ],
7. Modifier auth.php
config/auth.php
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'jwt', // 原来是 token 改成jwt 'provider' => 'users', ], ],
8. Enregistrez la route
Route::group([ 'prefix' => 'auth' ], function ($router) { $router->post('login', 'AuthController@login'); $router->post('logout', 'AuthController@logout'); });
9. >
php artisan make:controller AuthControllerLe code est le suivant :<?php namespace App\Http\Controllers; use App\Model\User; use Illuminate\Http\Request; use Tymon\JWTAuth\Facades\JWTAuth; 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('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(JWTAuth::parseToken()->touser()); } /** * Log the user out (Invalidate the token). * * @return \Illuminate\Http\JsonResponse */ public function logout() { JWTAuth::parseToken()->invalidate(); return response()->json(['message' => 'Successfully logged out']); } /** * Refresh a token. * * @return \Illuminate\Http\JsonResponse */ public function refresh() { return $this->respondWithToken(JWTAuth::parseToken()->refresh()); } /** * 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' => JWTAuth::factory()->getTTL() * 60 ]); } }Remarque : la tentative renvoie toujours false car le mot de passe est crypté. Utilisez bcrypt ou password_hash pour le crypter. 10. Vérifiez le jeton pour obtenir des informations sur l'utilisateurIl existe deux façons de l'utiliser : Ajoutez à l'url :?token=votre jeton Ajoutez-le à l'en-tête, il est recommandé d'utiliser ceci, car il est plus sécurisé sous https : Authorization:Bearer Your token11 Utilisez d'abord la commande artisan pour générer un middleware, je l'ai nommé RefreshToken.php. ici, créez Après le succès, vous devez hériter du code BaseMiddleware de JWT comme suit :
<?php namespace App\Http\Middleware; use Auth; use Closure; use Tymon\JWTAuth\Exceptions\JWTException; use Tymon\JWTAuth\Http\Middleware\BaseMiddleware; use Tymon\JWTAuth\Exceptions\TokenExpiredException; use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException; // 注意,我们要继承的是 jwt 的 BaseMiddleware class RefreshToken extends BaseMiddleware { /** * Handle an incoming request. * * @ param \Illuminate\Http\Request $request * @ param \Closure $next * * @ throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException * * @ return mixed */ public function handle($request, Closure $next) { // 检查此次请求中是否带有 token,如果没有则抛出异常。 $this->checkForToken($request); // 使用 try 包裹,以捕捉 token 过期所抛出的 TokenExpiredException 异常 try { // 检测用户的登录状态,如果正常则通过 if ($this->auth->parseToken()->authenticate()) { return $next($request); } throw new UnauthorizedHttpException('jwt-auth', '未登录'); } catch (TokenExpiredException $exception) { // 此处捕获到了 token 过期所抛出的 TokenExpiredException 异常,我们在这里需要做的是刷新该用户的 token 并将它添加到响应头中 try { // 刷新用户的 token $token = $this->auth->refresh(); // 使用一次性登录以保证此次请求的成功 Auth::guard('api')->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub']); } catch (JWTException $exception) { // 如果捕获到此异常,即代表 refresh 也过期了,用户无法刷新令牌,需要重新登录。 throw new UnauthorizedHttpException('jwt-auth', $exception->getMessage()); } } // 在响应头中返回新的 token return $this->setAuthenticationHeader($next($request), $token); } }La principale chose à dire ici est qu'une fois le jeton actualisé, non seulement le Le jeton doit être placé dans l'en-tête de retour, il est également préférable de remplacer le jeton dans l'en-tête de la requête, car après l'actualisation, le jeton dans l'en-tête de la requête est devenu invalide si la logique métier de l'interface utilise le jeton dans la requête. en-tête, des problèmes surviendront. Ici, nous utilisons
$request->headers->set('Authorization','Bearer '.$token);pour actualiser le jeton dans l'en-tête de la requête. Après avoir créé et écrit le middleware, il vous suffit d'enregistrer le middleware et d'ajouter une gestion des exceptions dans AppExceptionsHandler.php. 12. Ajoutez la configuration du middleware $routeMiddleware dans le fichier kernel.php
'RefreshToken' => \App\Http\Middleware\RefreshToken::class,13. Ajoutez la route
Route::group(['prefix' => 'user'],function($router) { $router->get('userInfo','UserController@userInfo')->middleware('RefreshToken'); });dans le contrôleur via JWTAuth : user (); peut obtenir des informations sur l'utilisateurPour plus d'articles techniques sur le framework Laravel, veuillez visiter le tutoriel
laravel !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!