📌  相关文章
📜  如何在 laravel 中大摇大摆地传递不记名令牌 - PHP (1)

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

如何在 Laravel 中大摇大摆地传递不记名令牌

在 Laravel 中,我们通常使用 CSRF 令牌来保护 Web 应用程序免受跨站点脚本攻击。不记名令牌(也称为“API 令牌”)相对于 CSRF 令牌来说更加安全,因为它不依赖于具体的用户会话。不记名令牌的作用是在每个请求中生成一个唯一的值,因此它可以防止恶意攻击者伪造您的应用程序请求。在本文中,我们将介绍如何在 Laravel 中使用不记名令牌。

生成不记名令牌

要在 Laravel 中生成一个不记名令牌,我们可以使用 Str::random(60) 函数生成一个非对称令牌字符串。然后,我们可以将该令牌存储在用户的会话中,以便我们稍后将它作为参数传递给 API。下面是一个示例代码片段:

use Illuminate\Support\Str;

$token = Str::random(60);

session()->put('api_token', $token);

在上面的示例中,我们使用 Str::random(60) 函数生成一个60个字符长度的随机字符串,并将其存储在名为“api_token”的会话变量中。

传递不记名令牌

现在,我们已经生成了不记名令牌,可以将其传递给您的 API 路由。在 Laravel 中,我们可以使用请求头来传递不记名令牌。您可以将 "Authorization" 请求头设置为 "Bearer",后跟生成的不记名令牌值,如下所示:

$response = $client->request('GET', '/api/user', [
    'headers' => [
        'Authorization' => 'Bearer ' . session()->get('api_token'),
    ],
]);

在这个示例中,我们使用 Guzzle HTTP 请求库发送 Get 请求,并使用请求头将 "Authorization" 值设置为 "Bearer" (类似于 OAuth 2.0),请求头的值为生成的不记名令牌。

验证不记名令牌

在 Laravel 中,我们可以使用中间件来验证不记名令牌。下面是一个验证不记名令牌的示例代码片段:

<?php

namespace App\Http\Middleware;

use Closure;

class VerifyApiToken
{
    public function handle($request, Closure $next)
    {
        $apiToken = $request->header('Authorization');

        if (! $apiToken) {
            abort(401, 'Unauthorized');
        }

        $apiToken = str_replace('Bearer ', '', $apiToken);

        if (! hash_equals(session()->get('api_token', ''), $apiToken)) {
            abort(401, 'Unauthorized');
        }

        return $next($request);
    }
}

在上面的示例中,我们创建了一个名为 "VerifyApiToken" 的中间件,并在 "handle" 方法中验证不记名令牌。我们获取请求中的 "Authorization" 请求头,

然后我们将其值中的 "Bearer" 删除,并使用哈希比较来验证令牌值是否与会话中的值相等。

结论

不记名令牌是一种保护 Web 应用程序免受恶意攻击者伪造请求的好方法。在 Laravel 中,我们可以使用生成和验证不记名令牌的简单技术来为我们的应用程序提供额外的安全性。