>PHP 프레임워크 >Laravel >laravel 설치 jwt-auth 및 확인(예)

laravel 설치 jwt-auth 및 확인(예)

L
L앞으로
2020-05-28 10:37:326007검색

ㅋㅋㅋ 를 기반으로 직접 작성해야 합니다)

laravel 설치 jwt-auth 및 확인(예)jwt 설치, 공식 문서 참조

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


2. 5.4보다 낮습니다


아래의 루트 디렉터리 config/app.php를 엽니다. 'providers' 배열에 TymonJWTAuthProvidersLaravelServiceProvider::class,

'providers' => [ ... TymonJWTAuthProvidersLaravelServiceProvider::class,]를 추가합니다. config.php 구성 파일에 jwt를 추가하세요

php artisan Vendor:publish --provider="TymonJWTAuthProvidersLaravelServiceProvider"

4. .env 파일 아래에 다음과 같은 암호화 키를 생성하세요: JWT_SECRET=foobarphp artisan 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. 두 개의 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 artisan 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 또는 비밀번호 해시를 사용하여 암호화하세요

10. 토큰 확인 사용자 정보를 얻는 방법은 두 가지가 있습니다

:

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

를 사용하여 요청 헤더의 토큰을 새로 고칩니다.

미들웨어를 생성하고 작성한 후 미들웨어를 등록하고 AppExceptionsHandler.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 설치 jwt-auth 및 확인(예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제