首頁 >php框架 >Laravel >Laravel開發:如何使用Laravel Sanctum實現SPA和API驗證?

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

WBOY
WBOY原創
2023-06-13 12:36:101184瀏覽

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指令來取得身份驗證令牌:

<head>
    <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="{{ asset('js/app.js') }}" defer></script>

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">

    <!-- Meta -->
    <meta name="csrf-token" content="{{ csrf_token() }}">
</head>
<body>
    <div id="app">
        <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
            <div class="container-fluid">
                <a class="navbar-brand" href="{{ url('/') }}">
                    {{ 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="{{ route('login') }}">{{ __('Login') }}</a>
                            </li>
                            @if (Route::has('register'))
                                <li class="nav-item">
                                    <a class="nav-link" href="{{ route('register') }}">{{ __('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()->name }}
                                </a>

                                <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
                                    <a class="dropdown-item" href="{{ route('logout') }}"
                                       onclick="event.preventDefault();
                                                     document.getElementById('logout-form').submit();">
                                        {{ __('Logout') }}
                                    </a>

                                    <form id="logout-form" action="{{ route('logout') }}" 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
</body>

在這個例子中,我們使用了Sanctum的@auth和@csrf Blade指令,用於取得使用者驗證令牌和CSRF令牌。

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

以上是Laravel開發:如何使用Laravel Sanctum實現SPA和API驗證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn