背景
laravel 版本:5.8
步驟
安裝 jwt
composer require tymon/jwt-auth=1.0.0-rc.5
配置
- 生成配置
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
php artisan jwt:secret
- config/auth.php 配置
<?php
return [
...
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
// 使用jwt
'api' => [
'driver' => 'jwt',
'provider' => 'user',
],
],
'providers' => [
// 指定model
'user' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
],
];
修改 User Model
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'nickname',
'avatar',
'openid',
'unionid',
];
/**
* 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 [];
}
}
添加自定義 Middleware
<?php
namespace App\Http\Middleware;
use App\Models\User;
use Closure;
use Illuminate\Contracts\Auth\Factory as Auth;
class ApiAuthenticate
{
/**
* The authentication guard factory instance.
*
* @var \Illuminate\Contracts\Auth\Factory
*/
protected $auth;
/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @return void
*/
public function __construct(Auth $auth)
{
$this->auth = $auth;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if ($this->auth->guard($guard)->guest()) {
if ($request->header('X-SkipAuth', 0) == 1) {
$this->skipAuth();
} else {
return response('Unauthorized.', 401);
}
}
return $next($request);
}
// 跳過認(rèn)證,取第一個
// 用戶接口調(diào)試柜蜈、站點監(jiān)控
private function skipAuth()
{
$user = User::query()->first();
$this->auth->login($user);
}
}
app/Http/Kernel.php 注冊自定義的 Middleware
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
//-------- 在這里添加剛才自定義的 middleware
'auth.api' => \App\Http\Middleware\ApiAuthenticate::class,
//-------- 添加結(jié)束
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
routes/api.php 添加路由闯参,使用 middleware
Route::post('/user/login', 'UserController@login');
Route::middleware('auth.api')->group(function () {
Route::get('/user/info', 'UserController@info');
});
完美結(jié)束
// TODO Lumen 使用 jwt