如何构建带两步认证的PHP API并实现年龄数据查询?
实现两步认证查询API的方案
一、数据库调整建议
你已有的用户表和人员信息表基础上,做以下优化能让API更稳定高效:
- 给用户表的
username加唯一索引,避免重复账号:ALTER TABLE user ADD UNIQUE INDEX idx_username (username); - 给人员信息表的
name和surname加联合索引,提升精准查询的速度:ALTER TABLE person ADD INDEX idx_name_surname (name, surname); - 可选:给用户表的
token加唯一索引,防止同一token被多个用户占用:ALTER TABLE user ADD UNIQUE INDEX idx_token (token);
二、PHP API实现
先准备一个数据库连接配置文件db_config.php,后续API都依赖它:
<?php $host = 'localhost'; $dbname = '你的数据库名'; $db_user = '数据库账号'; $db_pass = '数据库密码'; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $db_user, $db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die(json_encode(['status' => 'error', 'message' => '数据库连接失败'])); } ?>
1. 获取Token的API(get_token.php)
接收POST请求的username和password,验证通过后返回对应token:
<?php require 'db_config.php'; // 仅接受POST请求 if ($_SERVER['REQUEST_METHOD'] !== 'POST') { die(json_encode(['status' => 'error', 'message' => '仅支持POST请求'])); } // 提取并校验参数 $username = isset($_POST['username']) ? trim($_POST['username']) : ''; $password = isset($_POST['password']) ? trim($_POST['password']) : ''; if (empty($username) || empty($password)) { die(json_encode(['status' => 'error', 'message' => '用户名或密码不能为空'])); } try { // 注意:如果你的密码是明文存储,强烈建议改成哈希存储!以下是明文验证示例,实际要替换成哈希验证 $stmt = $pdo->prepare("SELECT token FROM user WHERE username = ? AND password = ?"); $stmt->execute([$username, $password]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user) { echo json_encode(['status' => 'success', 'token' => $user['token']]); } else { echo json_encode(['status' => 'error', 'message' => '用户名或密码错误']); } } catch(PDOException $e) { echo json_encode(['status' => 'error', 'message' => '查询失败:' . $e->getMessage()]); } ?>
关键提醒:禁止明文存储密码,正确做法是用户注册时用
password_hash($password, PASSWORD_DEFAULT)加密存储,验证时修改为:$stmt = $pdo->prepare("SELECT password, token FROM user WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user && password_verify($password, $user['password'])) { echo json_encode(['status' => 'success', 'token' => $user['token']]); } else { echo json_encode(['status' => 'error', 'message' => '用户名或密码错误']); }
2. 通过Token查询年龄的API(get_age.php)
接收POST请求的token、name、surname,先验证token有效性,再返回对应人员的年龄:
<?php require 'db_config.php'; if ($_SERVER['REQUEST_METHOD'] !== 'POST') { die(json_encode(['status' => 'error', 'message' => '仅支持POST请求'])); } // 提取并校验参数 $token = isset($_POST['token']) ? trim($_POST['token']) : ''; $name = isset($_POST['name']) ? trim($_POST['name']) : ''; $surname = isset($_POST['surname']) ? trim($_POST['surname']) : ''; if (empty($token) || empty($name) || empty($surname)) { die(json_encode(['status' => 'error', 'message' => 'token、姓名、姓氏不能为空'])); } try { // 先验证token是否合法 $stmt = $pdo->prepare("SELECT id FROM user WHERE token = ?"); $stmt->execute([$token]); if (!$stmt->fetch(PDO::FETCH_ASSOC)) { die(json_encode(['status' => 'error', 'message' => '无效的token'])); } // 查询对应人员的年龄 $stmt = $pdo->prepare("SELECT age FROM person WHERE name = ? AND surname = ?"); $stmt->execute([$name, $surname]); $person = $stmt->fetch(PDO::FETCH_ASSOC); if ($person) { echo json_encode(['status' => 'success', 'age' => $person['age']]); } else { echo json_encode(['status' => 'error', 'message' => '未找到对应人员信息']); } } catch(PDOException $e) { echo json_encode(['status' => 'error', 'message' => '查询失败:' . $e->getMessage()]); } ?>
三、使用示例
- 获取Token:发送POST请求到
get_token.php,携带参数username=xxx&password=xxx,返回包含token的JSON结果。 - 查询年龄:发送POST请求到
get_age.php,携带参数token=xxx&name=xxx&surname=xxx,返回包含年龄的JSON结果。
内容的提问来源于stack exchange,提问作者belosand
相关产品推荐
相关产品推荐

