續:jwt的安裝與使用--Auth認證
阿新 • • 發佈:2019-01-12
說明:仍是按照文件
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