1. 程式人生 > >續:jwt的安裝與使用--Auth認證

續:jwt的安裝與使用--Auth認證

說明:仍是按照文件
auth的認證,
一是判斷登陸狀態(auth),如未登陸則被攔截,然後轉交給登陸模組,這需要一箇中間件來完成。
二是管理登陸,即登陸邏輯login,登陸成功則傳送給使用者一個授權token;及logout退出登陸,銷燬token;忘記密碼forgetPassword;註冊signUp等。這需要一個專門的控制器來完成,在這裡編寫自定義邏輯。
在這之前,請閱讀文件,一些配置略過。

1,建立Auth控制器

php artisan make:controller Api\V1\AuthController

然後只需從文件的example複製貼上

namespace App\Http\Controllers\Api\V1;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
	//登陸
	public function login()
	{
		$credentials = request(['email', 'password']);
		//$credentials = request(['mobile', 'password']);

		if (! $token = auth()->attempt($credentials)) {
			return response()->json(['error' => '使用者名稱密碼錯誤'], 401);
		}

		return $this->respondWithToken($token);
	}

	//註冊
	public function signUp( Request $request ) {
		$post = $request->all();
		//...驗證
		$user = User::create($post); //建立使用者
		$token = auth()->login($user); //登陸
		return $this->respondWithToken($token);
	}

	//忘記密碼
	public function forgetPassword( Request $request ) {
		//$user = .. 更改密碼邏輯
		//$user->save()
		//$token = auth()->login($user);
		//return Y::json($this->respondWithToken($token));
	}

	//me
	public function me(  ) {
		$user  = auth()->user()->toArray();
		//$user['']=... 自定義邏輯
		return response()->json($user);
	}

	//退出登陸
	public function logout()
	{
		auth()->logout();
		//User::clearCache(auth()->id(), false); //如果你想對使用者資訊做快取的話
		return response()->json(['message' => 'Successfully logged out']);
	}

	//重新整理token
	public function refresh()
	{
		return $this->respondWithToken(auth()->refresh());
	}

	//生成token
	protected function respondWithToken($token)
	{
		return response()->json([
			//'username'     =>auth()->user()->username,
			'access_token' => $token,
			'token_type' => 'bearer',//可以更改
			'expires_in' => auth()->factory()->getTTL() * 60
		]);
	}
}

當然不要忘了新增對應的路由

Route::group(
	['prefix'=>'v1','namespace'=>'V1'],
	function(){
		
		Route::prefix('auth')->group(function () {
			Route::post('login', '[email protected]');
			Route::post('signUp', '[email protected]');
			Route::post('forgetPassword', '[email protected]
'); Route::get('logout', '[email protected]'); Route::get('refresh', '[email protected]'); }); } );

2,測試

使用postman工具

在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述

因為我們的註冊邏輯並沒有寫,所以手動在users表中,新增[email protected],password= Hash::make(123456);
在這裡插入圖片描述

這裡jwt元件的使用就算完成了。之後的每次請求,攜帶上access_token。
複製剛剛的access_token

在這裡插入圖片描述


在這裡插入圖片描述

3,第二部分,回到文章開頭的中介軟體部分。

文件中是這麼寫的

public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login']]);
    }

但也可以用專門的中介軟體來完成,易管理和擴充套件。

php artisan make:middleware ApiAuth

在這裡插入圖片描述


在這裡插入圖片描述

編寫中介軟體

public function handle($request, Closure $next)
{
        $auth = auth();
        $auth->shouldUse('api');
        if ($request->is(...$this->except) || ($auth->check() && $auth->user()->status == 1)) {
            return $next($request);
        }
       return response()->json(['code'=>401,'message' => '使用者驗證失敗,請重新登入']);
}
protected $except = [
        'v1/auth/login', //登陸
        'v1/auth/signUp', //註冊
        'v1/sendSms', //傳送郵件
        'v1/test/*', //測試
    ];

這裡除了判斷登陸,還對當使用者是否被禁用狀態的判斷。並且添加了不需要驗證的路由。

註冊中介軟體
在這裡插入圖片描述

使用中介軟體
在這裡插入圖片描述

測試:

剛剛我退出了登陸,下面請求forgetPassword方法。
在這裡插入圖片描述


在這裡插入圖片描述

end