laravel——JWT 二次使用記錄


#項目環境
laravel5.8   php7.1.3

#安裝擴展
composer require "tymon/jwt-auth:1.0.0" #選擇版本安裝

#編輯 config/app.php
#providers 中添加
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,

#aliases 添加
 'JWTAuth'=> Tymon\JWTAuth\Facades\JWTAuth::class,
 'JWTFactory'=> Tymon\JWTAuth\Facades\JWTFactory::class

#發佈JWT的配置文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"

#生成JWT Key
php artisan jwt:secret

#創建User模型
php artisan make:model  Models/User

#編輯User模型
<?php
namespace App\Models;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements JWTSubject
{
    //放開白名單
    protected $guarded = [];

    /**
     * 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 [];
    }
}


#關聯auth守衛 config->auth.php
'guards' => [
        'wap' => [
            'driver' => 'jwt',
            'provider' => 'users',
        ]
    ],

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
    ],


#創建中間件驗證token
php artisan make:middleware WapAuth
#編輯 app/Http/Middleware/WapAuth.php
<?php
 
namespace App\Http\Middleware;
 
use Closure;
use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Exceptions\TokenInvalidException;
 
class WapAuth
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        try {
            if (!$user = auth('wap')->user()){
                return response()->json([
                    'code' => 400004,
                    'msg' => '無此用戶'
                ]);
            }
        } catch (TokenExpiredException $e) {

            return response()->json([
                'code' => 400001,
                'msg' => 'token 過期'
            ]);
        } catch (TokenInvalidException $e) {

            return response()->json([
                'code' => 400003,
                'msg' => 'token 失效'
            ]);
        } catch (JWTException $e) {

            return response()->json([
                'code' => 400002,
                'msg' => 'token 參數錯誤'
            ]);
        }

        $request->merge(array('user'=>$user));
        return $next($request);
    }
 
 
}
#編輯app/Http/Kernel.php,添加別名
'wap.auth' => \App\Http\Middleware\WapAuth::class,

#創建控制器處理所有的請求

php artisan make:controller  Wap\LoginController
<?php
 
namespace App\Http\Controllers\Wap;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Tymon\JWTAuth\Facades\JWTAuth;

class LoginController extends Controller
{
    /**
     * 登陸
     */
    public function index(Request $request)
    {
        $input = $request->all();
        if($user = User::where($input)->first()){

            //$token = JWTAuth::fromUser($user);
            $token = auth('wap')->login($user);
        }else{

            return response()->json(['code'=>1,'msg'=>'賬號或密碼錯誤']);
        }

        return response()->json(['code'=>0,'msg'=>'登錄成功','data'=> $token]);
    }

    /**
     * 註冊
     */
    public function register(Request $request)
    {
        $input = $request->all();
        $input['password'] = md5($input['password']);
        User::create($input);
        return response()->json(['result'=>true]);
    }


    /**
     * 退出
     */
    public function quitLogin()
    {
        JWTAuth::invalidate(JWTAuth::getToken());
        return response()->json(['code'=>0,'msg' =>'退出成功']);
    }
}


#編輯路由文件 routes\api.php
<?php
#無驗證接口
Route::group(['namespace' => 'Wap', 'prefix' => 'wap'], function () {
    Route::post('/login', 'LoginController@index');  //登錄
});

#Token驗證
Route::group(['namespace' => 'Wap', 'prefix' => 'wap','middleware' => 'wap.auth'], function () {
    Route::post('/', 'IndexController@index');
    Route::post('/login/quitLogin', 'LoginController@quitLogin'); //退出登錄

});

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章