ホームページ  >  記事  >  PHPフレームワーク  >  laravelのインストール jwt-authと検証(例)

laravelのインストール jwt-authと検証(例)

L
L転載
2020-05-28 10:37:325865ブラウズ

laravelのインストール jwt-authと検証(例)


#laravel jwt-auth をインストールし、


#1 を確認します。composer を使用して jwt をインストールします。 cmd をプロジェクト フォルダーにコピーします;

composer require tymon/jwt-auth 1.0.* (必要に応じてバージョン番号をここに書きます)

jwt をインストールします。公式ドキュメントを参照してください

https: //jwt-auth.readthedocs.io/en/docs/laravel-installation/

2.laravel バージョンが 5.4 未満の場合

Open config/app php

Add Tymon\JWTAuth\Providers\LaravelServiceProvider::class,

'providers' => [ ... Tymon\JWTAuth\Providers\LaravelServiceProvider:: class ,]

3. jwt.php 設定ファイルを config

php の下に追加します。phpArtisan Vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

4 .env ファイルの下に暗号化キーを生成します (例: JWT_SECRET=foobar

php 職人 jwt:secret

5。ユーザー モデル

<?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. 2 つの 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. 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 を変更します。ルートを登録します

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 職人 make:controller AuthController

コードは次のとおりです:

<?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
        ]);
    }
}

注: 試行は維持されますパスワードが暗号化されているため false を返します。暗号化するには bcrypt または passwd_hash を使用してください。

10. トークンを検証してユーザー情報を取得します。

使用方法は 2 つあります:

url:?token=your token

ヘッダーに追加します。https: Authorization:Bearer your token でより安全であるため、これを使用することをお勧めします

11 , まず、artisan コマンドを使用してミドルウェアを生成します。ここでは RefreshToken.php という名前を付けました。作成が成功したら、JWT BaseMiddleware を継承する必要があります

#コードは次のとおりです:

<?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);
    }
}

ここで言うべき主なことは、トークンが更新された後、トークンを戻りヘッダーに配置する必要があるだけでなく、要求ヘッダー内のトークンを置き換えるのが最善であるということです。リクエスト ヘッダーのトークンが無効になりました。インターフェイスのビジネス ロジックがヘッダーのリクエスト トークンを使用すると、問題が発生します。

ここでは、

$request->headers->set(&#39;Authorization&#39;,&#39;Bearer &#39;.$token);

を使用してリクエスト ヘッダーのトークンを更新します。

ミドルウェアを作成して記述した後は、ミドルウェアを登録し、App\Exceptions\Handler.php に例外処理を追加するだけです。

12. kernel.php ファイルの

$routeMiddleware にミドルウェア設定を追加します

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

13. ルーティングを追加します

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

コントローラーに JWTAuth を渡します: user(); はユーザー情報を取得できます

laravel フレームワークの技術記事の詳細については、

laravel

tutorial をご覧ください。

以上がlaravelのインストール jwt-authと検証(例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。