noq / roomq
NoQ RoomQ
2.1.2
2021-11-18 04:55 UTC
Requires
- php: >=7.3.0
- firebase/php-jwt: ^5.3
- guzzlehttp/guzzle: ^7.0
- ramsey/uuid: ^4.1
README
从这里下载最新的composer包:这里。
composer require noq/roomq
RoomQ 后端 SDK - PHP
RoomQ 后端 SDK 用于服务器端集成。它是用 PHP 开发的。
高级逻辑
- 最终用户请求你的服务器上的页面
- SDK 验证请求是否包含有效的票据并且处于服务状态。如果不是,SDK 将将其发送到队列。
- 最终用户获取票据并在队列中等待,直到票据变为服务状态。
- 最终用户被重定向回你的网站,现在拥有有效的票据
- SDK 验证请求是否包含有效的票据并且处于服务状态。最终用户留在请求的页面上。
- 最终用户浏览到新页面,SDK 继续检查票据是否有效。
如何集成
先决条件
要集成 SDK,你需要以下信息,由 RoomQ 提供
- ROOM_ID
- ROOM_SECRET
- ROOMQ_TICKET_ISSUER
- ROOMQ_STATUS_API
- API_KEY
- LOCKER_URL
主要步骤
为了验证最终用户是否有权访问你的网站(已通过队列),需要以下步骤
- 初始化 RoomQ
- 确定当前请求页面/路径是否需要由 RoomQ 保护
- 初始化 Http Context Provider
- 验证请求
- 如果最终用户应该去队列,设置缓存控制
- 将用户重定向到队列
在特定路径上的集成
建议在选定的页面/路径上集成。对于静态文件,例如图片、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 的哈希值不会发送到服务器,哈希信息将会丢失。