token php实现

Token 在 PHP 中的实现方法
生成 Token
使用 bin2hex 和 random_bytes 生成安全的随机 Token:
$token = bin2hex(random_bytes(32));
使用 OpenSSL 生成更复杂的 Token
$token = openssl_random_pseudo_bytes(32);
$token = bin2hex($token);
基于时间戳的 Token 生成
$token = md5(uniqid(mt_rand(), true));
使用 hash_hmac 生成签名 Token
$secretKey = 'your-secret-key';
$data = 'user-data';
$token = hash_hmac('sha256', $data, $secretKey);
Token 验证实现
简单的 Token 比对
if ($userToken === $storedToken) {
// 验证通过
}
带时效性的 Token 验证
$tokenParts = explode('.', $token);
$tokenPayload = json_decode(base64_decode($tokenParts[1]), true);
if ($tokenPayload['exp'] > time()) {
// Token 有效
}
JWT Token 验证
需要安装 firebase/php-jwt 库:
use Firebase\JWT\JWT;
$key = "your-secret-key";
try {
$decoded = JWT::decode($jwt, $key, array('HS256'));
// Token 验证成功
} catch (Exception $e) {
// Token 无效
}
Token 存储方式
数据库存储
// 存储
$stmt = $pdo->prepare("INSERT INTO user_tokens (user_id, token, expires_at) VALUES (?, ?, ?)");
$stmt->execute([$userId, $token, $expiration]);
// 验证
$stmt = $pdo->prepare("SELECT * FROM user_tokens WHERE token = ? AND expires_at > NOW()");
$stmt->execute([$token]);
Session 存储
// 存储
$_SESSION['csrf_token'] = $token;
// 验证
if (!empty($_POST['token']) && $_POST['token'] === $_SESSION['csrf_token']) {
// 验证通过
}
Cookie 存储
// 存储
setcookie('remember_token', $token, time() + 86400 * 30, '/', '', true, true);
// 验证
if (isset($_COOKIE['remember_token']) && validateToken($_COOKIE['remember_token'])) {
// 自动登录
}
安全注意事项
- 总是使用足够长度的随机字节生成 Token
- 对敏感操作使用 CSRF Token
- 为 Token 设置合理的过期时间
- 使用 HTTPS 传输 Token
- 考虑使用专门的 JWT 库处理认证 Token
这些方法可以根据具体应用场景选择组合使用,实现安全的 Token 机制。







