laravel5.7 前后端分離開發 實現基於API請求的token認證


轉載自:https://blog.csdn.net/wei_yalin/article/details/86559513

最近在學習前后端分離開發,發現 在laravel中實現前后台分離是無法無法使用 CSRF Token 認證的。因為 web 請求的用戶認證是通過Session和客戶端Cookie的實現的,而前后端分離的應用無法通過API請求將Cookie CSRF Token 從前端傳遞到后端,但是還有一種解決方法,就是使用laravel自帶的 API token認證。

第一步:用戶表添加api_token字段

1、可以通過數據遷移的方式添加,像這樣:

 php artisan make:migration --table=用戶表名 add_api_token
 
 
 
         

 然后編寫這個遷移文件,文件位於 database/migration 

 


 
 
 
         
  1. class AddApiToken extends Migration
  2. {
  3. /**
  4. * Run the migrations.
  5. *
  6. * @return void
  7. */
  8. public function up()
  9. {
  10. Schema::table( '用戶表名', function (Blueprint $table) {
  11. $table->string( 'api_token', 200)->unique()->nullable();
  12. });
  13. }
  14. /**
  15. * Reverse the migrations.
  16. *
  17. * @return void
  18. */
  19. public function down()
  20. {
  21. Schema::table( '用戶表名', function (Blueprint $table) {
  22. $table->dropColumn([ 'api_token']);
  23. });
  24. }
  25. }

然后執行遷移命令

php artisan migrate
 
 
 
         

2、或者像我這樣,直接在數據庫用戶表中添加,O(∩_∩)O哈哈~

因為 varchar 存儲的是變長數據,也就是數據的真實長度,所以不要吝嗇可以給長度設大點。

第二步、添加認證服務方

我是多表認證,每個用戶角色有一張表,所以需要添加認證服務方,在 config/auth.php 中添加。一般使用已經默認的 api 認證方就好,

第三步、給用戶模型添加生成api_token方法


 
 
 
         
  1. /**
  2. * 更新token
  3. * @return mixed|string
  4. */
  5. public function generateToken() {
  6. $this->api_token = str_random( 128);
  7. $this->save();
  8. return $this->api_token;
  9. }

第四步、在控制器中添加登錄方法

這是我的登錄認證,是基於多表的用戶認證,我是個小菜菜,細節就不給你們看了,怕你們噴我⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄。總之是在登陸驗證成功之后,生成api_token並返回就可以了。

第五步、給路由添加認證中間件

api.php 添加如下路由,login 不需要守衛,給 logout 和 其他需要認證的路由添加守衛就可以了(auth:admin , 對應上面的admin用戶


 
 
 
         
  1. Route::any( 'unAuth', function () {
  2. return responseToJson( 1, '未認證或認證失敗');
  3. })->name( 'unAuth');
  4. Route::prefix( 'admin')->namespace( 'Admin')->group( function() {
  5. Route::post( 'login', 'LoginController@login');
  6. Route::middleware( 'auth:admin')->group( function() {
  7. Route::post( 'logout', 'LoginController@logout');
  8. Route::get( 'getMenu', 'MenuController@getMenu');
  9. });
  10. });

使用的是auth中間件,默認的路由我沒有O(∩_∩)O,所以需要進行修改。

修改中間件 Authenticate.php , 位於 app/Http/Middleware/Authenticate.php 。


 
 
 
         
  1. class Authenticate extends Middleware
  2. {
  3. /**
  4. * Get the path the user should be redirected to when they are not authenticated.
  5. *
  6. * @param \Illuminate\Http\Request $request
  7. * @return string
  8. */
  9. protected function redirectTo($request)
  10. {
  11. if (! $request->expectsJson()) {
  12. return route( 'unAuth');
  13. }
  14. }
  15. }

現在就已經好了,在登陸之后會返回 api_token ,然后請求其他路由的時候把 api_token 當參數傳過來。這樣當請求需要認證的路由的時候如果沒有 api_token 或者  api_token 錯誤,就會跳轉到 unAuth 路由,然后返回定義好的提示信息。

 第六步、退出時清除 token


 
 
 
         
  1. public function logout()
  2. {
  3. $user = Auth::guard( 'admin')->user();
  4. if ($user) {
  5. $user->api_token = null;
  6. $user->save();
  7. }
  8. return responseToJson( 0, '退出成功');
  9. }

還可以寫個中間件,每隔一段時間更新一下 api_token 值,同時前端也要更新 api_token 。我寫的也不是多好,可以看一下


 
 
 
         
  1. /**
  2. * Handle an incoming request.
  3. *
  4. * @param \Illuminate\Http\Request $request
  5. * @param \Closure $next
  6. * @param string|null $guard
  7. * @return mixed
  8. */
  9. public function handle($request, Closure $next, $guard)
  10. {
  11. $response = $next($request);
  12. //驗證token是否過期
  13. $user = Auth::guard($guard)->user();
  14. if (isTimeGreater($user->updated_token_at)){
  15. $response->header( "api_token", $user->generateToken());
  16. }
  17. return $response;
  18. }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM