Laravel開發:如何使用Laravel Sanctum實現SPA和API身份驗證?

laravel sanctum是一個輕量級的身份驗證包,能夠讓你在laravel應用中輕松地實現api認證和spa(單頁應用程序)認證。在本文中,我們將探討如何使用laravel sanctum來實現spa和api身份驗證。

首先,讓我們看看什么是SPA和API認證。

SPA認證是指單頁應用程序,它不會重新加載整個頁面,而是使用AJAX從Web服務器請求信息,以此更新局部內容。當使用SPA時,需要對API進行身份驗證,以確保只有經過身份驗證的用戶才能訪問它們。

API認證是指API請求身份驗證過程。當客戶端發送請求時,API需要驗證該請求是否來自所期望的用戶,以此保證API端點僅由經過身份驗證的用戶使用。

下面是如何使用Laravel Sanctum實現SPA和API身份驗證的步驟:

1、安裝Laravel Sanctum
我們可以使用composer包管理器安裝Laravel Sanctum。在Laravel項目中運行以下命令:

composer require laravel/sanctum

2、運行Laravel Sanctum的安裝器
Laravel Sanctum提供了一個安裝器,可以在安裝時自動配置我們的應用程序。我們可以使用以下命令運行此安裝器:

php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"

3、運行遷移
我們需要運行Sanctum遷移來創建必要的數據庫表,以支持Sanctum的操作。運行以下命令:

php artisan migrate

4、配置應用程序
我們需要將Laravel Sanctum添加到我們的中間件堆棧中:

'api' => [     'middleware' => ['auth:sanctum'],     'throttle:60,1',     'prefix' => 'api',     'namespace' => 'AppHttpControllersAPI', ],

5、為用戶頒發身份驗證令牌
在Laravel Sanctum中,我們可以使用tokenCan方法檢查令牌是否具有特定的API權限。我們可以使用createToken方法為用戶頒發身份驗證令牌:

use IlluminateHttpRequest;  /**  * Store a newly created resource in storage.  *  * @param  IlluminateHttpRequest  $request  * @return IlluminateHttpResponse  */ public function store(Request $request) {     $user = User::find(1);     $token = $user->createToken('token-name', ['server:update'])->plainTextToken;      return response()->json([         'access_token' => $token,         'token_type' => 'Bearer',     ]); }

這將為用戶創建一個名為‘token-name’的令牌,該令牌具有server:update權限。

6、保護API端點
在我們的控制器中,我們可以使用“middleware”方法來保護API端點:

public function update(Request $request, $id) {     if (!$request->user()->tokenCan('server:update')) {         abort(403, 'Unauthorized');     }      // Update the server }

在這個例子中,我們只允許那些具有server:update權限的用戶訪問update方法。

7、在SPA中使用身份驗證令牌
在我們的SPA中,我們可以使用Sanctum的@auth和@csrf Blade指令來獲取身份驗證令牌:

     <meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Laravel</title><!-- Fonts --><link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet"><script src="%7B%7B%20asset('js/app.js')%20%7D%7D" defer></script><!-- Styles --><link href="%7B%7B%20asset('css/app.css')%20%7D%7D" rel="stylesheet"><!-- Meta --><meta name="csrf-token" content="{{ csrf_token() }}"><div id="app">         <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm"><div class="container-fluid">                 <a class="navbar-brand" href="%7B%7B%20url('/')%20%7D%7D">                     {{ config('app.name', 'Laravel') }}                 </a>                 <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">                     <span class="navbar-toggler-icon"></span>                 </button>                  <div class="collapse navbar-collapse" id="navbarSupportedContent">                     <!-- Left Side Of Navbar -->                     <ul class="navbar-nav mr-auto"></ul> <!-- Right Side Of Navbar --><ul class="navbar-nav ml-auto"> <!-- Authentication Links -->                         @guest                             <li class="nav-item">                                 <a class="nav-link" href="%7B%7B%20route('login')%20%7D%7D">{{ __('Login') }}</a>                             </li>                             @if (Route::has('register'))                                 <li class="nav-item">                                     <a class="nav-link" href="%7B%7B%20route('register')%20%7D%7D">{{ __('Register') }}</a>                                 </li>                             @endif                         @else                             <li class="nav-item dropdown">                                 <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>                                     {{ Auth::user()-&gt;name }}                                 </a>                                  <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">                                     <a class="dropdown-item" href="%7B%7B%20route('logout')%20%7D%7D" onclick="event.preventDefault();                                                      document.getElementById('logout-form').submit();">                                         {{ __('Logout') }}                                     </a>                                      <form id="logout-form" action="%7B%7B%20route('logout')%20%7D%7D" method="POST" style="display: none;">                                         @csrf                                     </form>                                 </div>                             </li>                         @endguest                     </ul> </div>             </div>         </nav><main class="py-4">             @yield('content')         </main> </div>     @auth         <script>             window.Laravel = {!! json_encode([                 'csrf_token' => csrf_token(),                 'api_token' => Auth::user()->api_token             ]) !!};         </script>     @endauth 

在這個例子中,我們使用了Sanctum的@auth和@csrf Blade指令,用于獲取用戶身份驗證令牌和CSRF令牌。

這就是如何使用Laravel Sanctum實現SPA和API身份驗證的全部內容。使用Laravel Sanctum可以輕松地保護我們的API端點和SPA應用程序,并幫助我們實現最佳安全實踐。

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享