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 介面。 此介面需要實現兩個方法 getJWTIdentifier 和 getJWTCustomClaims。使用以下內容更新 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 "
字串,
之後需要驗證的介面通過在Header中傳入引數則能通過訪問
本作品採用《CC 協議》,轉載必須註明作者和本文連結