📜  laravel sanctum axios 未验证 - PHP (1)

📅  最后修改于: 2023-12-03 15:32:33.770000             🧑  作者: Mango

Laravel Sanctum Axios 未验证 - PHP

介绍

本文将介绍如何使用 Laravel Sanctum 和 Axios 在前后端分离的应用中进行未经过身份验证的请求。Laravel Sanctum 是一个轻量级的认证库,可用于在 Laravel 应用程序中运行几乎所有类型的身份验证。Axios 是一个流行的 HTTP 客户端库,它允许在浏览器和 Node.js 中进行 HTTP 请求。

身份验证

在进行任何未经过身份验证的请求之前,需要先对用户进行身份验证。在 Laravel Sanctum 中,可以使用以下方法:

一、凭据 (Credential)

使用任何支持凭据的方法,例如用户名和密码,来验证用户。然后,使用 Laravel Sanctum 生成一个 API 令牌。在生成令牌后,可以将其存储在本地存储或 cookie 中。

二、 API 令牌 (API Token)

如果您已经有了应用程序的用户系统,并且每个用户都有一个唯一的 API 令牌,则可以使用此方法。在 Laravel Sanctum 中,可以使用以下方法生成 API 令牌:

$user->createToken('name')->plainTextToken;

此方法将在用户上创建一个新的 API 令牌,并返回一个可读的、明文的 API 令牌字符串。请注意,这些令牌是一次性的,且不能被重复使用。

Axios

Axios 是一个常用的 HTTP 客户端库,可以在浏览器和 Node.js 中使用。

安装

在使用 Axios 之前,请先确保是否已经在应用程序中安装并注册过。如果您还没有安装,可以通过以下命令安装:

npm install axios
用法

在使用 Axios 时,需要先配置 baseURL 以指向您应用程序的 API 地址。这是一个全局配置,您只需要配置一次即可:

import axios from 'axios';

axios.defaults.baseURL = 'http://api.example.com';

此外,您还需要确保发送请求的 HTTP 方法在 Laravel 应用程序中已启用。例如,如果您要使用 GET 方法进行请求,则需要在 app/Http/Kernel.php 文件中的 $middlewareGroups 属性中添加 api 验证中间件:

protected $middlewareGroups = [
    // ...

    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

现在,您可以使用 Axios 来发送请求。以下示例演示如何使用 Axios 发送一个 GET 请求:

axios.get('/api/users')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.log(error.response);
  });
未经过身份验证的请求

在某些情况下,您可能需要在不进行身份验证的情况下发送请求。例如,在您的应用程序的某些页面或组件中,如果没有身份验证,可能需要显示有限数据。在 Laravel Sanctum 中,可以使用以下方法来处理未验证请求:

CSRF 保护

Laravel Sanctum 在其 CSRF 保护中使用了一个桶策略来针对内部 API 路由。当请求进入时,它将被分配给一个桶,该桶由作用域和加密以后的请求路径生成。如果请求是从前端发起的,它将分配给存储在样式、脚本或 URL 参数中的奇数桶(working_bucket),如果请求是来自 API 客户机,则将分配给偶数桶(backup_bucket)。如果任何请求到达桶,则桶被清空,并且该请求被允许。如果在请求到达之前有一段时间没有请求到达该桶,则该桶将被清空。

如果您需要在前端发起未验证的请求,则需要向 Laravel Sanctum 发送一个名为 X-Requested-With 的请求头,并将其设置为 XMLHttpRequest

axios.get('/api/users', {
  headers: {
    'X-Requested-With': 'XMLHttpRequest'
  }
})
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.log(error.response);
  });
未验证的路由

在某些情况下,您可能需要在后台应用程序中添加一些公共路由,以供未经身份验证的用户访问。在 Laravel Sanctum 中,可以使用以下方法创建未经身份验证的路由:

use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;

Route::middleware(EnsureFrontendRequestsAreStateful::class)
    ->get('/api/public', function () {
        return response()->json(['message' => 'Public API']);
    });

在此示例中,我们使用 EnsureFrontendRequestsAreStateful 中间件,以确保请求是从前端发起的。此外,还可以使用其他中间件,例如 throttle,来限制请求率等。

总结

本文介绍了如何使用 Laravel Sanctum 和 Axios 在前后端分离的应用中进行未经过身份验证的请求。我们讨论了身份验证、Axios、未经身份验证的请求和一些其他相关主题。希望这篇文章能够帮助您进一步深入学习 Laravel Sanctum 和 Axios。