トークン発行の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の確認はしません。
curl https://backend.example.com/| サーバー | 返す本文 |
|---|---|
| PHP版 | {"message":"Ready to serve your realm."} |
| Vercel版 | {"message":"Hello udonarium-backend-vercel!"} |
GET /v1/status
動いていれば、200でOK(テキスト)を返します。Axeは部屋に入る前にこれを呼び、サーバーが動いているかを確かめます。
# PHP版:Originは要りません
curl https://backend.example.com/v1/status
# Vercel版:許可したOriginを付けます
curl -H "Origin: https://axe.example.com" https://backend.example.com/v1/statusVercel版はOriginが要ります
Vercel版は、/v1/の下のすべてのリクエストでOriginを確かめます。ブラウザのアドレスバーに/v1/statusを入れて開くと、Originが付かないのでORIGIN_REQUIREDが返ります。確かめるときは、上のようにcurlでOriginを付けてください。
POST /v1/skyway2023/token
SkyWayの認証トークンを発行します。
リクエスト
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版のしくみにあります。
レスポンス
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }トークンの中身はSkyWay版のしくみにあります。
Vercel版で付くヘッダー
Vercel版では、このパスは古い名前として残しているので、レスポンスに次のヘッダーが付きます。動きはPOST /v1/skyway/tokensと同じです。
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-Methods | GET, POST, OPTIONS | POST,GET,OPTIONS |
Access-Control-Allow-Headers | Content-Type, Accept | Content-Type,Accept |
Access-Control-Max-Age | 86400(1日) | 86400(1日) |
エラー
PHP版
本文は{"error": "<メッセージ>"}の形です(405だけはテキスト)。
| 状態 | メッセージ | 起きるとき |
|---|---|---|
| 400 | Origin is required. | Originヘッダーがない |
| 400 | Bad Request. | 本文がJSONでない、またはフィールドの値が正しくない |
| 403 | Forbidden. | 許可していないOriginから来た |
| 404 | Not Found. | そのパスが無い |
| 405 | Method Not Allowed | パスはあるが、そのメソッドは受け付けない |
| 413 | Request Entity Too Large. | 本文が64KBを超えた |
| 415 | Unsupported Media Type. | Content-Typeがapplication/jsonでない |
| 500 | (本文なし) | .envが見つからない・読めない、必須の値がない |
500のときは、原因がPHPのエラーログに出ます。.envを読めないと、/v1/statusを含むすべてのリクエストが500になります。
Vercel版
本文は{"error": {"code": "<コード>", "message": "<説明>"}}の形です。
| 状態 | コード | 起きるとき |
|---|---|---|
| 400 | ORIGIN_REQUIRED | Originヘッダーがない |
| 400 | VALIDATION_FAILED | 本文がJSONでない、またはフィールドの形が正しくない |
| 403 | ORIGIN_FORBIDDEN | 許可していないOriginから来た |
| 500 | CONFIG_INVALID | 環境変数が足りないか、形が違う |
| 500 | INTERNAL_ERROR | それ以外の失敗 |