Laravel开发:如何使用Laravel Sanctum为SPA提供API身份验证?

广告:宝塔Linux面板高效运维的服务器管理软件 点击【 https://www.bt.cn/p/uNLv1L 】立即购买

Laravel开发:如何使用Laravel Sanctum为SPA提供API身份验证?

Laravel开发:如何使用Laravel Sanctum为SPA提供API身份验证?

随着单页应用程序(SPA)的流行,我们需要一种可靠的方法来保护我们的API免受未经授权的访问和攻击。Laravel Sanctum是Laravel提供的一个轻量级的认证系统,它为SPA提供轻松的身份验证。本文将向您展示如何使用Laravel Sanctum为SPA提供API身份验证。

使用Laravel Sanctum

Laravel Sanctum是Laravel 7.x版本中的一个官方包,用于API身份验证。Laravel Sanctum使用该API的Token来识别用户身份,并且可以通过使用token轻松执行多个身份验证的构建。

安装Laravel Sanctum

首先,需确保已安装Laravel框架。

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

composer require laravel/sanctum
登录后复制

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

'providers' => [    // ...    LaravelSanctumSanctumServiceProvider::class,],
登录后复制

现在,可以运行以下命令发布必要的数据库迁移和Sanctum配置。

php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
登录后复制

执行以下命令以运行迁移:

php artisan migrate
登录后复制

使用Sanctum进行默认身份验证

Sanctum包含API和单页应用程序身份验证的默认实现。可以通过为用户模型使用SanctumTraitsHasApiTokens trait来启用默认身份验证。

将HasApiTokens trait添加到用户模型

<?phpnamespace AppModels;use IlluminateFoundationAuthUser as Authenticatable;use IlluminateNotificationsNotifiable;use LaravelSanctumHasApiTokens;class User extends Authenticatable{    use Notifiable, HasApiTokens;    // ...}
登录后复制

为了更好的解释,我们将使用一个简单的SPA示例。假设示例的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' => '*',            'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',            'Access-Control-Allow-Headers' => 'Origin, Content-Type, Accept, Authorization, X-Request-With',            'Access-Control-Allow-Credentials' => 'true',        ];        $this->app['router']->middleware('api')->get('/sanctum/csrf-cookie', function () {            return response()->json(['status' => 'success']);        });        foreach ($headers as $key => $value) {            config(['cors.supportsCredentials' => true]);            config(['cors.paths.api/*' => [                'allowedOrigins' => ['http://spa.test'],                'allowedHeaders' => [$key],                'allowedMethods' => ['*'],                'exposedHeaders' => [],                'maxAge' => 86400,            ]]);        }    }}
登录后复制

将上述代码中的http://spa.test替换为您的SPA的URL。

令牌验证和API保护说明

在控制器中,我们可以使用Sanctum的auth中间件来保护路由

public function index(Request $request){    $user = $request->user();    // ...}public function store(Request $request){    $user = $request->user();    // ...}public function destroy(Request $request, string $id){    $user = $request->user();      // ...}public function update(Request $request, string $id){    $user = $request->user();    // ...}
登录后复制

这会从请求标头中获取Sanctum授权令牌,并使用该令牌验证用户。如果未在标头中提供授权令牌,则将返回401未经授权的错误。

发出授权令牌请求

在我们的SPA中,我们可以使用axios库来使用API并获取令牌。要获取授权令牌,我们需要首先获取CSRF令牌,所以我们需要发送一个GET请求来获取它。

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

上面的代码将在http://api.spa.test中发出POST请求,在服务器上创建一个新的Sanctum授权令牌,并将令牌作为response.data.token进行响应。此后,我们可以将令牌添加到axios的通用头文件中,以在SPA中使用所有后续请求。

注意,此示例假设有一个名为“login”的路由。

Sanctum还为我们提供了一个logout路由来撤销授权令牌。

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

结论

Laravel Sanctum是一个轻量级的简单实用的身份验证系统,它易于集成和使用,并提供默认的身份验证功能,是SPA身份验证的绝佳解决方案。一旦您与Sanctum一起使用,您将不再需要编写自己的身份验证系统。它能够让我们为我们的API快速实现安全的身份验证,并让我们的SPA与API在很短的时间内交互。

以上就是Laravel开发:如何使用Laravel Sanctum为SPA提供API身份验证?的详细内容,更多请关注9543建站博客其它相关文章!

广告:SSL证书一年128.66元起,点击购买~~~

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。

作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:ie不兼容css
下一篇:php数组元素全部转化数字

发表评论

关闭广告
关闭广告