Laravel開發(fā):如何使用Laravel Sanctum為SPA提供API身份驗(yàn)證?

laravel開發(fā):如何使用laravel sanctum為spa提供api身份驗(yàn)證?

隨著單頁(yè)應(yīng)用程序(SPA)的流行,我們需要一種可靠的方法來保護(hù)我們的API免受未經(jīng)授權(quán)的訪問和攻擊。Laravel Sanctum是Laravel提供的一個(gè)輕量級(jí)的認(rèn)證系統(tǒng),它為SPA提供輕松的身份驗(yàn)證。本文將向您展示如何使用Laravel Sanctum為SPA提供API身份驗(yàn)證。

使用Laravel Sanctum

Laravel Sanctum是Laravel 7.x版本中的一個(gè)官方包,用于API身份驗(yàn)證。Laravel Sanctum使用該API的Token來識(shí)別用戶身份,并且可以通過使用token輕松執(zhí)行多個(gè)身份驗(yàn)證的構(gòu)建。

安裝Laravel Sanctum

首先,需確保已安裝Laravel框架。

要安裝laravel sanctum,可以使用以下命令

composer require laravel/sanctum

將ServiceProvider添加到config/app.php文件的providers列表中。

'providers' => [     // ...     LaravelSanctumSanctumServiceProvider::class,  ],

現(xiàn)在,可以運(yùn)行以下命令發(fā)布必要的數(shù)據(jù)庫(kù)遷移和Sanctum配置。

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

執(zhí)行以下命令以運(yùn)行遷移:

php artisan migrate

使用Sanctum進(jìn)行默認(rèn)身份驗(yàn)證

Sanctum包含API和單頁(yè)應(yīng)用程序身份驗(yàn)證的默認(rèn)實(shí)現(xiàn)。可以通過為用戶模型使用SanctumTraitsHasApiTokens trait來啟用默認(rèn)身份驗(yàn)證。

將HasApiTokens trait添加到用戶模型

<?php namespace AppModels;  use IlluminateFoundationAuthUser as Authenticatable; use IlluminateNotificationsNotifiable; use LaravelSanctumHasApiTokens;  class User extends Authenticatable {     use Notifiable, HasApiTokens;      // ... }

為了更好的解釋,我們將使用一個(gè)簡(jiǎn)單的SPA示例。假設(shè)示例的URL為http://spa.test和通過http://api.spa.test公開的API。

在Laravel中配置CORS

將下面的代碼添加到app/Providers/AppServiceProvider.php文件中來允許跨域資源共享(CORS)。

... use IlluminateSupportFacadesSchema; use IlluminateSupportFacadesURL;  class AppServiceProvider extends ServiceProvider {     public function boot()     {         Schema::defaultStringLength(191);          if (config('app.env') === 'production') {             URL::forceScheme('https');         }          $headers = [             'Access-Control-Allow-Origin' =&gt; '*',             'Access-Control-Allow-Methods' =&gt; 'POST, GET, OPTIONS, PUT, DELETE',             'Access-Control-Allow-Headers' =&gt; 'Origin, Content-Type, Accept, Authorization, X-Request-With',             'Access-Control-Allow-Credentials' =&gt; 'true',         ];         $this-&gt;app['router']-&gt;middleware('api')-&gt;get('/sanctum/csrf-cookie', function () {             return response()-&gt;json(['status' =&gt; 'success']);         });          foreach ($headers as $key =&gt; $value) {             config(['cors.supportsCredentials' =&gt; true]);             config(['cors.paths.api/*' =&gt; [                 'allowedOrigins' =&gt; ['http://spa.test'],                 'allowedHeaders' =&gt; [$key],                 'allowedMethods' =&gt; ['*'],                 'exposedHeaders' =&gt; [],                 'maxAge' =&gt; 86400,             ]]);         }     } }

將上述代碼中的http://spa.test替換為您的SPA的URL。

令牌驗(yàn)證和API保護(hù)說明

在控制器中,我們可以使用Sanctum的auth中間件來保護(hù)路由

public function index(Request $request) {     $user = $request-&gt;user();     // ... }  public function store(Request $request) {     $user = $request-&gt;user();     // ... }  public function destroy(Request $request, string $id) {     $user = $request-&gt;user();       // ... }  public function update(Request $request, string $id) {     $user = $request-&gt;user();     // ... }

這會(huì)從請(qǐng)求標(biāo)頭中獲取Sanctum授權(quán)令牌,并使用該令牌驗(yàn)證用戶。如果未在標(biāo)頭中提供授權(quán)令牌,則將返回401未經(jīng)授權(quán)的錯(cuò)誤。

發(fā)出授權(quán)令牌請(qǐng)求

在我們的SPA中,我們可以使用axios庫(kù)來使用API并獲取令牌。要獲取授權(quán)令牌,我們需要首先獲取CSRF令牌,所以我們需要發(fā)送一個(gè)GET請(qǐng)求來獲取它。

axios.get('http://api.spa.test/sanctum/csrf-cookie').then(response =&gt; {     axios.post('http://api.spa.test/login', {         username: this.username,         password: this.password     }).then(response =&gt; {         axios.defaults.headers.common['Authorization'] = `Bearer ${response.data.token}`;         this.$router.push({ name: 'home' });     }); });

上面的代碼將在http://api.spa.test中發(fā)出POST請(qǐng)求,在服務(wù)器上創(chuàng)建一個(gè)新的Sanctum授權(quán)令牌,并將令牌作為response.data.token進(jìn)行響應(yīng)。此后,我們可以將令牌添加到axios的通用頭文件中,以在SPA中使用所有后續(xù)請(qǐng)求。

注意,此示例假設(shè)有一個(gè)名為“l(fā)ogin”的路由。

Sanctum還為我們提供了一個(gè)logout路由來撤銷授權(quán)令牌。

axios.post('http://api.spa.test/logout').then(response =&gt; {     delete axios.defaults.headers.common['Authorization'];     this.$router.push({ name: 'login' }); });

結(jié)論

Laravel Sanctum是一個(gè)輕量級(jí)的簡(jiǎn)單實(shí)用的身份驗(yàn)證系統(tǒng),它易于集成和使用,并提供默認(rèn)的身份驗(yàn)證功能,是SPA身份驗(yàn)證的絕佳解決方案。一旦您與Sanctum一起使用,您將不再需要編寫自己的身份驗(yàn)證系統(tǒng)。它能夠讓我們?yōu)槲覀兊腁PI快速實(shí)現(xiàn)安全的身份驗(yàn)證,并讓我們的SPA與API在很短的時(shí)間內(nèi)交互。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊12 分享