本文へ移動

トークン発行のAPI ​

PHP版とVercel版が受けるHTTPのAPIです。Axeが使うのはGET /v1/statusとPOST /v1/skyway2023/tokenの2つで、どちらのサーバーでも同じように答えます。エラーの本文の形など、細かいところはサーバーごとに違うので、それぞれの節で説明します。

エンドポイントの一覧 ​

メソッドパスPHP版Vercel版内容
GET/○○動いているかの簡単な確認
GET/v1/status○○動いているかの確認。Axeが最初に呼ぶ
POST/v1/skyway2023/token○○SkyWayのトークンを発行する。Axeが呼ぶ
POST/v1/skyway/tokens○上と同じ。Vercel版で新しく使うときの名前
OPTIONS上のPOSTのパス○○ブラウザのプリフライトに答える

GET / ​

サーバーが動いていれば、JSONを返します。Originの確認はしません。

sh
curl https://backend.example.com/
サーバー返す本文
PHP版{"message":"Ready to serve your realm."}
Vercel版{"message":"Hello udonarium-backend-vercel!"}

GET /v1/status ​

動いていれば、200でOK(テキスト)を返します。Axeは部屋に入る前にこれを呼び、サーバーが動いているかを確かめます。

sh
# PHP版:Originは要りません
curl https://backend.example.com/v1/status

# Vercel版:許可したOriginを付けます
curl -H "Origin: https://axe.example.com" https://backend.example.com/v1/status

Vercel版はOriginが要ります

Vercel版は、/v1/の下のすべてのリクエストでOriginを確かめます。ブラウザのアドレスバーに/v1/statusを入れて開くと、Originが付かないのでORIGIN_REQUIREDが返ります。確かめるときは、上のようにcurlでOriginを付けてください。

POST /v1/skyway2023/token ​

SkyWayの認証トークンを発行します。

リクエスト ​

http
POST /v1/skyway2023/token
Origin: https://axe.example.com
Content-Type: application/json

{
  "formatVersion": 1,
  "channelName": "部屋のチャンネル名",
  "peerId": "自分のピアID"
}
フィールド型内容
formatVersion数値1だけを受け付けます
channelName文字列入る部屋のSkyWayのチャンネル名
peerId文字列自分のピアID
  • Originは、ACCESS_CONTROL_ALLOW_ORIGINに書いたOriginのどれかでなければなりません。
  • PHP版は、Content-Type: application/jsonでないリクエストを415で断ります。本文は64KBまでです。
  • channelNameとpeerIdの中身も確かめます(空、200バイト超、*や\を含むもの、udonarium-lobby-で始まる部屋名を断る)。理由はSkyWay版のしくみにあります。

レスポンス ​

json
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }

トークンの中身はSkyWay版のしくみにあります。

Vercel版で付くヘッダー ​

Vercel版では、このパスは古い名前として残しているので、レスポンスに次のヘッダーが付きます。動きはPOST /v1/skyway/tokensと同じです。

http
Deprecation: true
Link: </v1/skyway/tokens>; rel="successor-version"

プリフライト(OPTIONS) ​

ブラウザは、Content-Type: application/jsonを付けたPOSTの前に、OPTIONSで送ってよいかを尋ねます。許可したOriginからなら、204で次のヘッダーを返します。

ヘッダーPHP版Vercel版
Access-Control-Allow-Origin一致した許可リストの値リクエストのOrigin
Access-Control-Allow-MethodsGET, POST, OPTIONSPOST,GET,OPTIONS
Access-Control-Allow-HeadersContent-Type, AcceptContent-Type,Accept
Access-Control-Max-Age86400(1日)86400(1日)

エラー ​

PHP版 ​

本文は{"error": "<メッセージ>"}の形です(405だけはテキスト)。

状態メッセージ起きるとき
400Origin is required.Originヘッダーがない
400Bad Request.本文がJSONでない、またはフィールドの値が正しくない
403Forbidden.許可していないOriginから来た
404Not Found.そのパスが無い
405Method Not Allowedパスはあるが、そのメソッドは受け付けない
413Request Entity Too Large.本文が64KBを超えた
415Unsupported Media Type.Content-Typeがapplication/jsonでない
500(本文なし).envが見つからない・読めない、必須の値がない

500のときは、原因がPHPのエラーログに出ます。.envを読めないと、/v1/statusを含むすべてのリクエストが500になります。

Vercel版 ​

本文は{"error": {"code": "<コード>", "message": "<説明>"}}の形です。

状態コード起きるとき
400ORIGIN_REQUIREDOriginヘッダーがない
400VALIDATION_FAILED本文がJSONでない、またはフィールドの形が正しくない
403ORIGIN_FORBIDDEN許可していないOriginから来た
500CONFIG_INVALID環境変数が足りないか、形が違う
500INTERNAL_ERRORそれ以外の失敗

MITライセンスで公開しています