noq/roomq

2.1.2 2021-11-18 04:55 UTC

README

从这里下载最新的composer包:这里。

composer require noq/roomq

RoomQ 后端 SDK - PHP

RoomQ 后端 SDK 用于服务器端集成。它是用 PHP 开发的。

高级逻辑

The SDK Flow

  1. 最终用户请求你的服务器上的页面
  2. SDK 验证请求是否包含有效的票据并且处于服务状态。如果不是,SDK 将将其发送到队列。
  3. 最终用户获取票据并在队列中等待,直到票据变为服务状态。
  4. 最终用户被重定向回你的网站,现在拥有有效的票据
  5. SDK 验证请求是否包含有效的票据并且处于服务状态。最终用户留在请求的页面上。
  6. 最终用户浏览到新页面,SDK 继续检查票据是否有效。

如何集成

先决条件

要集成 SDK,你需要以下信息,由 RoomQ 提供

  1. ROOM_ID
  2. ROOM_SECRET
  3. ROOMQ_TICKET_ISSUER
  4. ROOMQ_STATUS_API
  5. API_KEY
  6. LOCKER_URL

主要步骤

为了验证最终用户是否有权访问你的网站(已通过队列),需要以下步骤

  1. 初始化 RoomQ
  2. 确定当前请求页面/路径是否需要由 RoomQ 保护
  3. 初始化 Http Context Provider
  4. 验证请求
  5. 如果最终用户应该去队列,设置缓存控制
  6. 将用户重定向到队列

在特定路径上的集成

建议在选定的页面/路径上集成。对于静态文件,例如图片、CSS 文件、JS 文件等,建议跳过验证。你可以在将其传递给验证之前确定请求类型。

实现示例

以下是一个 RoomQ 在 PHP 中的集成示例。

<?php
require __DIR__ . '/../vendor/autoload.php';

use NoQ\RoomQ\RoomQ;
use NoQ\RoomQ\LockerItem;
use NoQ\RoomQ\Exception\NotServingException;
use NoQ\RoomQ\Exception\InvalidTokenException;
use NoQ\RoomQ\Exception\InvalidApiKeyException;
use NoQ\RoomQ\Exception\ReachLimitException;

const ROOM_ID = "ROOM ID";
const ROOM_SECRET = "ROOM SECRET";
const ROOMQ_TICKET_ISSUER = "TICKET ISSER URL";
const ROOMQ_STATUS_API = "STATUS API";
const API_KEY = "API KEY";
const LOCKER_URL = "LOCKER URL";

$roomq = new RoomQ(ROOM_ID, ROOM_SECRET, ROOMQ_TICKET_ISSUER, ROOMQ_STATUS_API, false);

// Handle GET requests
if ($_SERVER['REQUEST_METHOD'] === 'GET') {

    // Check if the request has valid ticket
    // If "session id" is null, SDK will generate UUID as "session id"
    $result = $roomq->validate(null, "session id");
    if ($result->needRedirect()) {
        header("Location: {$result->getRedirectURL()}");
        exit;
    }

    try {
        // Retrieve the expiry time of the ticket
        echo $roomq->getServing();
    } catch (NotServingException $e) {
        // Ticket is not in serving state
    } catch (InvalidTokenException $e) {
        // Ticket is invalid
    } catch (Exception $e) {
        // other server issue
    }


    try {
        // Delete Ticket
        $roomq->deleteServing();
    } catch (NotServingException $e) {
        // Ticket is not in serving state
    } catch (InvalidTokenException $e) {
        // Ticket is invalid
    } catch (Exception $e) {
        // other server issue
    }


    try {
        // Extend Ticket's expiry time
        // Please enable this feature in Web Portal as well
        $roomq->extend(60);
    } catch (NotServingException $e) {
        // Ticket is not in serving state
    } catch (InvalidTokenException $e) {
        // Ticket is invalid
    } catch (Exception $e) {
        // other server issue
    }

    // Locker Function
    $locker = $roomq->getLocker(API_KEY, LOCKER_URL);

    /** Put data in locker */
    try {
        $locker->put([
            new LockerItem("key1", "value1", 1, 5),
            new LockerItem("key2", "value2", 1, 5),
        ], time() + 600); // expire after 10 minutes
    } catch (InvalidApiKeyException $e) {
        // invalid api key
    } catch (ReachLimitException $e) {
        // limit reached in the locker
    } catch (Exception $e) {
        // other server issue
    }

    /** Find key value pairs inside current locker */
    try {
        print_r(json_encode($locker->fetch()));
    } catch (InvalidApiKeyException $e) {
        // invalid api key
    } catch (Exception $e) {
        // other server issue
    }

    /** Find sessions with key and value */
    try {
        print_r($locker->findSessions("string", "string"));
    } catch (InvalidApiKeyException $e) {
        // invalid api key
    } catch (Exception $e) {
        // other server issue
    }

    echo "Entered";
}

Ajax 调用

RoomQ 还不支持在 Ajax 调用中验证票据。

浏览器 / CDN 缓存

如果你的响应在浏览器或 CDN 上缓存,新的请求将不会由 RoomQ 处理。一般来说,对于集成了 RoomQ 的页面/路径,你不太可能将响应缓存到 CDN 或浏览器上。

URL 的哈希值

由于 URL 的哈希值不会发送到服务器,哈希信息将会丢失。

版本指南