DingoApi 中使用 JWT

18601774706發表於2020-04-07

DingoApi中使用JWT

首先需要安裝laravel框架到本地(laravel 7為例 )

一.composer 安裝準備包DingApi

安裝DingoApi:

composer require dingo/api

釋出 API 的配置檔案到 config 檔案

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

生成 api.php檔案在config下
然後你可以在 .env中配置DingoApi

API_STANDARDS_TREE=vnd
API_SUBTYPE=myapp
API_PREFIX=api
API_VERSION=v1
API_NAME=My API
API_CONDITIONAL_REQUEST=false
API_STRICT=false

之後你可以通過DingApi方式訪問介面:
1.建立端點

$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function ($api) {
    $api->group(['namespace' => 'App\Http\Api\Controllers'], function ($api) {
        $api->post('login', 'LoginController@login');//定義登入方法
    }
}

2.通過postman能訪問定義端點

127.0.0.1:8006/api/login

二.安裝 tymon/jwt-auth 擴充套件包

laravel 5.5或以上:

composer require tymon/jwt-auth:dev-develop --prefer-source

釋出配置檔案執行,生成 jwt.php在config下生成,可在裡面配置過期時間等配置資訊

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

生成jwt金鑰

php artisan jwt:secret

註冊中介軟體

app/Http/Kernel.php 中註冊 auth.jwt 中介軟體:

protected $routeMiddleware = [
    ....
    'auth.jwt' => \Tymon\JWTAuth\Http\Middleware\Authenticate::class,
];

設定路由

在路由中需要驗證token的地方,將建立的路由修改成:

$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function ($api) {
    $api->group(['namespace' => 'App\Http\Api\Controllers'], function ($api) {
        $api->post('login', 'LoginController@login');//定義登入方法
        $api->group(['middleware' => 'api.auth'], function ($api) {//退出登入
            $api->post('login_out', 'LoginController@login_out');
        });
    }
}

更新 User 模型

WT 需要在 User 模型中實現 TymonJWTAuthContractsJWTSubject 介面。 此介面需要實現兩個方法 getJWTIdentifiergetJWTCustomClaims。使用以下內容更新 app/User.php

<?php

namespace App;

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

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

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

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

config下的auth.php修改成

 'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
    ],

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

User.php模型放入自己新建立的資料夾中路徑App\Http\Models

記得修改config下的Auth.php檔案中的

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Http\Models\User::class, //修改成你指定的名稱空間
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

此時在去執行建立好的login路由login方法

/**
*登入
**/
 public function login(Request $request)
    {
        $input = $request->only('name', 'password');
        $jwt_token = null;

        if (!$jwt_token = auth()->attempt($input)) {
            return response()->json([
                'success' => false,
                'message' => 'Invalid Email or Password',
            ], 401);
        }
        die('bearer '.$jwt_token);
    }

傳入正確的登入引數後此時$jwt_token會返回一個token值token值需要前面拼接"bearer "字串,

DingoApi 中使用 JWT

之後需要驗證的介面通過在Header中傳入引數則能通過訪問

DingoApi 中使用 JWT

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章