当前位置:首页 > PHP

php 实现扫码登录

2026-01-15 13:47:36PHP

PHP 实现扫码登录的流程

扫码登录的核心流程分为两部分:前端生成二维码并轮询状态,后端验证扫码状态并返回登录凭证。以下是具体实现方法:

生成唯一二维码

  1. 创建临时令牌
    在用户访问登录页面时,后端生成一个唯一令牌(如UUID)并存入Redis或数据库,设置较短的有效期(如300秒):

    $token = bin2hex(random_bytes(16));
    $redis->setex("scan_token:$token", 300, 'waiting'); // 状态初始为等待
  2. 返回二维码内容
    将令牌拼接成扫码登录URL(如 https://example.com/scan?token=xxx),通过前端生成二维码:

    $qrUrl = "https://example.com/scan?token=$token";
    echo json_encode(['qr_url' => $qrUrl]);

移动端扫码处理

  1. 解析二维码内容
    移动端APP扫描二维码后,提取URL中的令牌,携带用户身份(如已登录的APP session)调用后端验证接口:

    // 移动端请求示例
    POST /api/scan_confirm
    Body: { "token": "xxx", "user_id": 123 }
  2. 验证并更新令牌状态
    后端检查令牌是否存在且未过期,若合法则更新状态为“confirmed”并关联用户ID:

    if ($redis->exists("scan_token:$token")) {
        $redis->setex("scan_token:$token", 60, json_encode([
            'status' => 'confirmed',
            'user_id' => $user_id
        ]));
    }

前端轮询状态

  1. 定时检查令牌状态
    前端通过AJAX每2秒查询一次令牌状态,直到超时或状态变更:

    // 后端处理轮询请求
    $data = $redis->get("scan_token:$token");
    if ($data && json_decode($data)->status === 'confirmed') {
        echo json_encode(['status' => 'success', 'user_id' => $user_id]);
    }
  2. 完成登录跳转
    当前端收到“success”状态后,后端生成登录凭证(如Session或JWT),返回给前端完成登录:

    $_SESSION['user_id'] = $user_id;
    setcookie('auth_token', generateJWT($user_id), time()+3600);

安全增强措施

  • 限制令牌使用次数
    每个令牌仅允许一次成功确认,防止重放攻击。

  • HTTPS传输
    确保所有接口和二维码URL通过HTTPS传输,避免中间人攻击。

  • 短时效设计
    二维码和令牌的过期时间需足够短(建议1-5分钟)。

    php 实现扫码登录

完整实现需结合具体框架(如Laravel或ThinkPHP)调整,但核心逻辑保持一致。

标签: php
分享给朋友:

相关文章

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…

php 实现md5

php 实现md5

使用 PHP 内置函数实现 MD5 PHP 提供了 md5() 函数,可以直接计算字符串的 MD5 哈希值。该函数接受一个字符串参数,返回 32 字符的十六进制哈希值。 $string = "H…

php 实现锁

php 实现锁

PHP 实现锁的常见方法 文件锁(flock) 利用 flock 函数对文件进行独占锁定,适用于单机环境。 $fp = fopen("lockfile.lock", "w+"); if (f…