2025-09-05 17:37:42
Token认证是一种在客户端和服务器之间生成和验证身份的机制。与传统的会话认证不同,Token认证不需要在服务器上存储会话信息,而是使用一个唯一的Token来标识用户的身份。这种方式不仅提高了安全性,还增加了让RESTful API或单页面应用更灵活的可能性。
通常,Token是通过服务器端的某种算法生成的,包含了一些用户信息和一个过期时间。生成Token时,我们可以使用JWT(JSON Web Token)格式来包装我们的Token,确保它的安全性和有效性。
```php function generateToken($userId) { $header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']); $payload = json_encode(['sub' => $userId, 'exp' => time() 3600]); // 1小时有效期 $base64UrlHeader = str_replace([' ', '/', '='], ['-', '_', ''], base64_encode($header)); $base64UrlPayload = str_replace([' ', '/', '='], ['-', '_', ''], base64_encode($payload)); $signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, 'your_secret_key', true); $base64UrlSignature = str_replace([' ', '/', '='], ['-', '_', ''], base64_encode($signature)); return $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature; } ```在上面的代码中,我们首先创建了JWT的头部和载荷。然后,我们使用HMAC SHA256算法生成签名。最后,返回一个完整的Token。
当用户请求敏感数据时,我们需要验证他们的Token。验证过程包括检查Token的有效性、解析Token并验证用户身份。
```php function validateToken($token) { $tokenParts = explode('.', $token); $header = json_decode(base64_decode($tokenParts[0]), true); $payload = json_decode(base64_decode($tokenParts[1]), true); $signature = $tokenParts[2]; $expectedSignature = str_replace([' ', '/', '='], ['-', '_', ''], base64_encode(hash_hmac('sha256', $tokenParts[0] . "." . $tokenParts[1], 'your_secret_key', true))); if ($signature !== $expectedSignature) { return false; // 签名无效 } if ($payload['exp'] < time()) { return false; // Token已过期 } return $payload['sub']; // 返回用户ID } ```在验证函数中,我们首先将Token拆分为头部、载荷和签名。接着,我们重新计算签名并与传入的签名进行比较。如果一致且Token未过期,则返回用户ID。
为了更好地理解Token的作用,以下是一个使用Token进行用户身份验证的简单示例。
```php // 用户登录 if (isset($_POST['username'])