搜尋
首頁php框架Laravel分析laravel8中的dingo與jwt鑑權

以下由laravel教學專欄為大家介紹laravel8中dingo與jwt鑑權,希望對需要的朋友有幫助!

1 什麼是dingo

dingo api包是給laravel和lumen提供的Restful的工具包,它可以與jwt組件一起配合快速的完成用戶認證,同時對於數據和運行過程中所產生的異常能夠捕捉到並且可以做出對應的響應。
主要功能:

  1. Router Version 路由版本管理
  2. http Exception 例外處理
  3. response transform 轉換回應格式
# 1 安裝dingo

在laravel根目錄下透過composer進行dingo擴充包的安裝,具體命令如下:

composer require dingo/api

使用以下命令可以發布API 的設定檔到config 檔案下:

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 什麼是JWT

jwt全名為JSON Web Tokens ,是一個非常輕巧的規範,這個規範允許我們使用jwt在使用者和伺服器之間傳遞安全可靠的訊息,他的主要使用場景為:認證與資料交換

#1 安裝JWT

在laravel根目錄下透過composer進行jwt擴充包的安裝,具體命令如下:

composer require tymon/jwt-auth

使用以下命令可以發布API 的設定檔到config 檔案下:

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/develop/

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

User模型需要實作兩個方法: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中構建具有高級功能的寧靜API?如何在Laravel中構建具有高級功能的寧靜API?Mar 11, 2025 pm 04:13 PM

本文指導建立強大的Laravel Restful Apis。 它涵蓋項目設置,資源管理,數據庫交互,序列化,身份驗證,授權,測試和關鍵的安全性最佳實踐。 解決可伸縮性chall

如何在Laravel中實施OAuth2身份驗證和授權?如何在Laravel中實施OAuth2身份驗證和授權?Mar 12, 2025 pm 05:56 PM

本文詳細介紹了Laravel實施OAuth 2.0身份驗證和授權。 它涵蓋了使用League/oauth2-server或提供商特定解決方案的軟件包,強調數據庫設置,客戶端註冊,授權服務器Configu

如何使用Laravel的組件來創建可重複使用的UI元素?如何使用Laravel的組件來創建可重複使用的UI元素?Mar 17, 2025 pm 02:47 PM

本文討論了使用組件在Laravel中創建和自定義可重複使用的UI元素,從而為組織提供最佳實踐並建議增強包裝。

在雲原生環境中使用Laravel的最佳實踐是什麼?在雲原生環境中使用Laravel的最佳實踐是什麼?Mar 14, 2025 pm 01:44 PM

本文討論了在雲本地環境中部署Laravel的最佳實踐,重點是可擴展性,可靠性和安全性。關鍵問題包括容器化,微服務,無狀態設計和優化策略。

如何在Laravel中創建和使用自定義驗證規則?如何在Laravel中創建和使用自定義驗證規則?Mar 17, 2025 pm 02:38 PM

本文討論了Laravel中的創建和使用自定義驗證規則,提供了定義和實施的步驟。它突出了諸如可重複性和特異性之類的好處,並提供了擴展Laravel驗證系統的方法。

Laravel vs. Symfony:哪個適合您的Web應用程序?Laravel vs. Symfony:哪個適合您的Web應用程序?Mar 10, 2025 pm 01:34 PM

在選擇PHP框架方面,Laravel和Symfony是最受歡迎和廣泛使用的選項之一。每個框架都為桌子帶來了自己的理念,特徵和優勢,使它們適合不同的項目和用例

如何在Laravel中創建和使用自定義刀片指令?如何在Laravel中創建和使用自定義刀片指令?Mar 17, 2025 pm 02:50 PM

本文討論了Laravel中的創建和使用自定義刀片指令以增強模板。它涵蓋了定義指令,在模板中使用它們,並在大型項目中管理它們,強調了改進的代碼可重複性和R等好處

在Laravel中處理文件上傳和雲存儲的最佳方法是什麼?在Laravel中處理文件上傳和雲存儲的最佳方法是什麼?Mar 12, 2025 pm 05:54 PM

本文探討了Laravel中最佳的文件上傳和雲存儲策略。 它檢查本地存儲與雲提供商(AWS S3,Google Cloud,Azure,Digitalocean),強調安全性(驗證,消毒,HTTPS)和Performance Opti

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),