Maison  >  Article  >  cadre php  >  installation de laravel jwt-auth et vérification (exemple)

installation de laravel jwt-auth et vérification (exemple)

L
Lavant
2020-05-28 10:37:325865parcourir

installation de laravel jwt-auth et vérification (exemple)


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.

&#39;aliases&#39; => [
        ...
        // 添加以下两行
        &#39;JWTAuth&#39; => &#39;Tymon\JWTAuth\Facades\JWTAuth&#39;,
        &#39;JWTFactory&#39; => &#39;Tymon\JWTAuth\Facades\JWTFactory&#39;,
],

7. Modifier auth.php

config/auth.php

&#39;guards&#39; => [
    &#39;web&#39; => [
        &#39;driver&#39; => &#39;session&#39;,
        &#39;provider&#39; => &#39;users&#39;,
    ],
    &#39;api&#39; => [
        &#39;driver&#39; => &#39;jwt&#39;,      // 原来是 token 改成jwt
        &#39;provider&#39; => &#39;users&#39;,
    ],
],

8. Enregistrez la route

Route::group([
    &#39;prefix&#39; => &#39;auth&#39;
], function ($router) {
    $router->post(&#39;login&#39;, &#39;AuthController@login&#39;);
    $router->post(&#39;logout&#39;, &#39;AuthController@logout&#39;);
});

9. >

php artisan make:controller AuthController

Le 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(&#39;auth:api&#39;, [&#39;except&#39; => [&#39;login&#39;]]);
    }
    /**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login()
    {
        $credentials = request([&#39;email&#39;, &#39;password&#39;]);
        if (! $token = auth(&#39;api&#39;)->attempt($credentials)) {
            return response()->json([&#39;error&#39; => &#39;Unauthorized&#39;], 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([&#39;message&#39; => &#39;Successfully logged out&#39;]);
    }
    /**
     * 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([
            &#39;access_token&#39; => $token,
            &#39;token_type&#39; => &#39;bearer&#39;,
            &#39;expires_in&#39; => 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'utilisateur

Il 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 token

11 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(&#39;jwt-auth&#39;, &#39;未登录&#39;);
        } catch (TokenExpiredException $exception) {
            // 此处捕获到了 token 过期所抛出的 TokenExpiredException 异常,我们在这里需要做的是刷新该用户的 token 并将它添加到响应头中
            try {
                // 刷新用户的 token
                $token = $this->auth->refresh();
                // 使用一次性登录以保证此次请求的成功
                Auth::guard(&#39;api&#39;)->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()[&#39;sub&#39;]);
            } catch (JWTException $exception) {
                // 如果捕获到此异常,即代表 refresh 也过期了,用户无法刷新令牌,需要重新登录。
                throw new UnauthorizedHttpException(&#39;jwt-auth&#39;, $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(&#39;Authorization&#39;,&#39;Bearer &#39;.$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

&#39;RefreshToken&#39; => \App\Http\Middleware\RefreshToken::class,

13. Ajoutez la route

Route::group([&#39;prefix&#39; => &#39;user&#39;],function($router) {
    $router->get(&#39;userInfo&#39;,&#39;UserController@userInfo&#39;)->middleware(&#39;RefreshToken&#39;);
});

dans le contrôleur via JWTAuth : user (); peut obtenir des informations sur l'utilisateur

Pour 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer