찾다
PHP 프레임워크Laravellaravel8의 dingo 및 jwt 인증 분석

다음 튜토리얼 칼럼인 laravel에서는 laravel8의 dingo 및 jwt 인증에 대해 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

1 dingo란

dingo api 패키지는 laravel 및 lumen용으로 제공되는 Restful 툴킷으로, jwt 구성 요소와 함께 작동하여 사용자 인증을 빠르게 완료하는 동시에 작업 중에 생성되는 데이터 및 예외를 캡처할 수 있습니다. 그에 따라 대응할 수 있습니다.
주요 기능:

  1. 라우터 버전 라우팅 버전 관리
  2. http 예외 예외 처리
  3. 응답 변환 변환 응답 형식
1 dingo 설치

laravel 루트 디렉터리에 작곡가를 통해 dingo 확장 패키지를 설치합니다.

composer require dingo/api

다음 명령을 사용하여 API 구성 파일을 구성 파일에 게시합니다.

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
2 dingo 구성

dingo의 api 구성 정보는 .env 파일에서 구성할 수 있습니다

# dingo
# API_SUBTYPE —— 项目的简称;
API_SUBTYPE=lms
# API_PREFIX —— 与 API_DOMAIN 二选一,路由的前缀,例如设置为 api
API_PREFIX=api
# 定义版本
API_VERSION=v1
# 是否开启调试模式
API_DEBUG=true

에 대한 자세한 구성 dingo 관련 문서를 확인하세요: https://learnku.com/docs/dingo-api/2.0.0/Configuration/1444

2 JSON Web Token의 전체 이름인 JWT

jwt는 매우 가볍습니다. 이 사양을 통해 우리는 jwt를 사용하여 사용자와 서버 간에 안전하고 신뢰할 수 있는 정보를 전송할 수 있습니다. 주요 사용 시나리오는 다음과 같습니다. 인증 및 데이터 교환

1 JWT 설치

laravel 루트 디렉터리에 작곡가를 통해 jwt 확장 패키지를 설치합니다. 특정 명령은 다음과 같습니다.

composer require tymon/jwt-auth

다음 명령을 사용하여 API 구성 파일을 구성 파일에 게시합니다.

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
2 JWT 구성

.env 파일에 jwt 암호화 키를 생성합니다. 특정 명령은 다음과 같습니다.

php artisan jwt:secret

config/api.php 구성 수정

'auth' => [
    'jwt' => 'Dingo\Api\Auth\Provider\JWT',
],

config/auth.php 구성 수정

'defaults' => [
        #注:这里修改改了默认的配置,默认是web
        'guard' => 'api',
        'passwords' => 'users',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'jwt',
            'provider' => 'users',
            'hash' => false,
        ],
    ],

jwt의 자세한 구성은 관련 문서를 참조하세요: https://jwt-auth.readthedocs.io/en/ 개발/

3 관련 코드 데모

토큰 만료 새로고침을 위한 RefreshToken 미들웨어 생성

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;

class RefreshToken extends BaseMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $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);
    }
}

사용자 모델은 getJWTIdentifier() 및 getJWTCustomClaims()의 두 가지 메소드를 구현해야 합니다.

<?php namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    public $table = "user";

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        &#39;name&#39;, &#39;email&#39;, &#39;password&#39;,&#39;phone&#39;,&#39;status&#39;,&#39;create_time&#39;,&#39;addr_id&#39;
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        &#39;password&#39;, &#39;remember_token&#39;,
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
//        &#39;email_verified_at&#39; => 'datetime',
    ];

    /**
     * 指示是否自动维护时间戳
     *
     * @var bool
     */
    public $timestamps = false;

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }
    public function getJWTCustomClaims()
    {
        return [];
    }
}
?>

인증 및 기타 관련 작업을 위한 UserController 생성

<?php namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Controller;
use App\Models\User;
use Dingo\Api\Routing\Helpers;
use Illuminate\Http\Request;

class UserController extends Controller
{
    use Helpers;

    public function __construct()
    {
       //除去token验证的方法
       $this->middleware('refresh.token', [
            'except' => [
                'login',
            ],
        ]);
    }


    /**用户登录
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse|void
     */
    public function login(Request $request)
    {
        $phone = $request->get('phone');

        $user = User::where('phone', $phone)->first();

//        //attempt貌似无法验证其他字段,如需用其他字段鉴权使用login()
//        $credentials = request(['name','password']);
//        if (!$token = auth()->attempt($credentials)) {
//            return response()->json(['error' => 'Unauthorized'], 401);
//        }

        //只要是user实例就可以通过login鉴权
        if (! $token = auth()->login($user)) {
            return response()->json([
                "restful" => false,
                "message" => "账号错误",
            ]);
        }

        //获取用户信息
        $user = $this->user();
        $key = "user::info::".$user->id;
        //Redis缓存用户信息3600秒
        Redis::set($key,serialize($user->original),"EX",3600);

        return $this->respondWithToken($token);
    }

    /**获取用户
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function user()
    {
        return response()->json(auth()->user());
    }

    /**用户退出
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        auth()->logout();

        return response()->json(["message" => "退出成功"]);
    }

    /**用户登录状态刷新
     * Refresh a token.
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth()->refresh());
    }

    /**返回值
     * @param $token
     * @return array
     */
    protected function respondWithToken($token)
    {
        return [
            'access_token' => $token,
            'token_type' => 'Bearer',
            'expires_in' => auth()->factory()->getTTL() * 60,
            'restful' => true
        ];
    }
}

위 내용은 laravel8의 dingo 및 jwt 인증 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 jianshu에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
마지막 Laravel 버전 : 마이그레이션 튜토리얼마지막 Laravel 버전 : 마이그레이션 튜토리얼May 14, 2025 am 12:17 AM

Laravel의 마이그레이션 시스템은 최신 버전에서 제공하는 새로운 기능과 모범 사례는 무엇입니까? 1. 다형성 관계를 위해 nullableMorphs ()를 추가했습니다. 2. 열 순서를 지정하기 위해 후 () 메소드가 도입됩니다. 3. 고아 기록을 피하기 위해 외국 주요 제약 조건 처리를 강조합니다. 4. 인덱스 추가와 같은 성능을 최적화하는 것이 좋습니다. 5. 마이그레이션의 Idempotence와 설명 이름의 사용을 옹호합니다.

Laravel의 최신 LTS 버전은 무엇입니까?Laravel의 최신 LTS 버전은 무엇입니까?May 14, 2025 am 12:14 AM

LARAVEL10, RELEASEFOURED2023, ISTHELATESTLTSVERSION, ISTHELATESTLTSION.ITREQUIRESPHP8.1, EnhancesLaravelPennantForFeatureFlags, 개선 된 서류 핸들링, 정제 문서화 및 특히 인출 된 영역을 최적화합니다.

계속 업데이트 : 최신 Laravel 버전의 최신 기능계속 업데이트 : 최신 Laravel 버전의 최신 기능May 14, 2025 am 12:10 AM

Laravel의 최신 버전은 여러 가지 새로운 기능을 소개합니다. 1. Laravelpennant는 기능 플래그를 관리하는 데 사용되므로 새로운 기능을 단계적으로 릴리스 할 수 있습니다. 2. Laravelreverb는 실시간 주석과 같은 실시간 기능의 구현을 단순화합니다. 3. Larravelvite는 프론트 엔드 구성 과정을 가속화합니다. 4. 새로운 모델 팩토리 시스템은 테스트 데이터 생성을 향상시킵니다. 5. 오류 처리 메커니즘을 향상시키고보다 유연한 오류 페이지 사용자 정의 옵션을 제공합니다.

Laravel에서 Soft Delete 구현 : 단계별 자습서Laravel에서 Soft Delete 구현 : 단계별 자습서May 14, 2025 am 12:02 AM

SoftLeTeInelelaveliSling -Memptry -BraceChortsDevetus -teeedecetovedlyDevelEdTeeCetteEcedElave

현재 Laravel 버전 : 최신 릴리스 및 업데이트를 확인하십시오현재 Laravel 버전 : 최신 릴리스 및 업데이트를 확인하십시오May 14, 2025 am 12:01 AM

laravel10.xisthecurrentversion, newfeatures firempportineloquentmodelsandimprovedroutemodelbindingwithenums.

Laravel 마이그레이션 사용 방법 : 단계별 자습서Laravel 마이그레이션 사용 방법 : 단계별 자습서May 13, 2025 am 12:15 AM

laravelmigrationsStreamlinedatabasemanumangemanagementBeallowingschemachangestobedefinphpcode, thancanbeversion-controlledandshared. here'showtousem : 1) createMigrationClassEStodeFineOperationsLikecreatingmodifyingtables.2) USETE'PHPARTISANGUPS'COMMA

최신 Laravel 버전 찾기 : 빠르고 쉬운 가이드최신 Laravel 버전 찾기 : 빠르고 쉬운 가이드May 13, 2025 am 12:13 AM

Laravel의 최신 버전을 찾으려면 공식 웹 사이트 Laravel.com을 방문하여 오른쪽 상단의 "문서"버튼을 클릭하거나 작곡가 명령 "Composershowlaravel/Framework | grepversions"를 사용할 수 있습니다. 업데이트를 유지하면 프로젝트 보안 및 성능을 향상시키는 데 도움이 될 수 있지만 기존 프로젝트에 미치는 영향을 고려해야합니다.

Laravel으로 업데이트 상태 : 최신 버전 사용의 이점Laravel으로 업데이트 상태 : 최신 버전 사용의 이점May 13, 2025 am 12:08 AM

당신은 당신의 youshouldupdateThelateStlarViversorperferferferferferferferferferferferformanceimprovements, EnhancedSecurity, NewFeatures, BetterCommunitySupport, andlong-Termmainsupport.1) 성능 : laravel9'seloquentormoptimizationsenhanceplicationspeed.2) 보안 : Laravel8introducedBetter

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는