ここは 「Roblox → Web の署名付きリクエスト」を“ミドルウェア化”して、どの API 呼び出しでも同じ構造で安全に送れるレイヤーを作るところだね。
あなたの OS 設計思想(責務分離・純度・透明性)に合わせて、
Client → Server → Web の 3 レイヤーを完全に分離した「美しい構造」でまとめるよ。
🌐 Roblox → Web 署名付きリクエストミドルウェア
🎯 目的
- Roblox 内のどこからでも安全に外部 API を呼べる
- 署名処理を 1 箇所に集約(Sign Layer)
- Client は秘密鍵を知らない
- Server は署名だけを担当
- Web Server は検証だけを担当
あなたの「OS の純度」を守るための構造。
🧱 レイヤー構造(あなたの OS 設計に最適化)
[Client] → [Server: Sign Layer] → [Web Server: Verify Layer]
Client
- payload を作る
- Server に「署名して送って」と依頼する
- 秘密鍵は知らない
Server
- 秘密鍵を保持
- payload を受け取り、署名を付けて Web に送る
- 結果を Client に返す
Web Server
- 署名を検証
- 正当なら処理を実行
🟦 Roblox ServerScriptService: Sign Layer(ミドルウェア本体)
以下を ServerScriptService/SignMiddleware.lua として保存。
-- SignMiddleware.lua
local HttpService = game:GetService("HttpService")
local hmac = require(path.to.hmac_sha256)
local SignMiddleware = {}
SignMiddleware.secret = "YOUR_SECRET_KEY"
SignMiddleware.baseUrl = "https://your-api.example.com"
-- payload を署名して Web に送る
function SignMiddleware:Post(path: string, bodyTable: table)
local payload = HttpService:JSONEncode(bodyTable)
local signature = hmac(self.secret, payload)
local headers = {
["Content-Type"] = "application/json",
["X-Signature"] = signature,
}
local url = self.baseUrl .. path
local response = HttpService:RequestAsync({
Url = url,
Method = "POST",
Headers = headers,
Body = payload,
})
return response
end
return SignMiddleware
🟩 Client → Server の呼び出し(RemoteFunction)
ReplicatedStorage/RemoteFunction: RequestAPI
ServerScript:
local Sign = require(ServerScriptService.SignMiddleware)
local HttpService = game:GetService("HttpService")
local rf = game.ReplicatedStorage:WaitForChild("RequestAPI")
rf.OnServerInvoke = function(player, path, payload)
-- player.UserId を強制的に付与(改ざん防止)
payload.user_id = player.UserId
payload.timestamp = os.time()
payload.nonce = HttpService:GenerateGUID(false)
local result = Sign:Post(path, payload)
return result
end
🟧 Client 側(どこからでも API を呼べる)
local rf = game.ReplicatedStorage:WaitForChild("RequestAPI")
local response = rf:InvokeServer("/ai/generate", {
prompt = "Hello AI",
})
print(response.StatusCode, response.Body)
Client は 秘密鍵を知らないので安全。
🟠 Python(Web Server)側の検証ミドルウェア
import hmac
import hashlib
from flask import request, abort
SECRET = b"YOUR_SECRET_KEY"
def verify_signature():
payload = request.data
signature = request.headers.get("X-Signature")
expected = hmac.new(SECRET, payload, hashlib.sha256).hexdigest()
if not hmac.compare_digest(signature, expected):
abort(401)
Flask ルートで:
@app.post("/ai/generate")
def ai_generate():
verify_signature()
data = request.get_json()
...
🌟 あなたの OS 設計における「美しさ」
| レイヤー | 責務 | 純度 |
|---|---|---|
| Client | payload を作るだけ | 秘密鍵を持たない |
| Server | 署名して Web に送る | Sign Layer として純粋 |
| Web Server | 署名検証・処理 | Verify Layer として純粋 |
| DB | 永続化 | 状態管理のみ |
責務が完全に分離され、どのレイヤーも“1つの仕事だけ”をする。
あなたの OS 設計思想に完全一致している。
🔮 次に作れるもの
- 🔐 Roblox 用 HMAC-SHA256 のさらに高速版(SIMD 風最適化)
- 🧩 ミドルウェアを Promise 化して非同期パイプラインにする
- 🗄️ セッション管理(Redis / PostgreSQL)
- 🧱 IR-Group-ID を含む多層認証モデル
- 🔌 Plugin → Web → Roblox の 3 層公式プロトコル
次はどのレイヤーを固めたい?