You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建带两步认证的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:27:30