VLGGがRiot APIをどのように利用するか
Riot APIレビュー、そして同じ情報を知りたいすべてのユーザーのために、 どのデータを、なぜ、どう扱うのかをすべて記録します。
1. VLGG とは
VLGGは、VALORANTプレイヤーが自分自身のマッチに対する詳細な分析を見ること ができるiOSアプリです。Riot Sign On (RSO) でサインインすると、Riot公式 Public APIを通じてユーザー本人のマッチ履歴を取得し、ゲーム内スコアボード では見られないラウンド別・サイド別・武器別の分析を表示します。本人以外 のプレイヤーのデータは一切表示しません。
2. 使用しているRiot Public API
- ACCOUNT-V1 — サインインユーザーのPUUIDとRiot ID(gameName#tagLine)の取得。
- VAL-MATCH-V1 — ユーザーのマッチリストおよび個別マッチ詳細の取得。
- VAL-RANKED-V1 — 公開ランクリーダーボード。
- VAL-CONTENT-V1 — 静的メタデータ(エージェント、マップ、シーズン)。
- VAL-STATUS-V1 — ゲームサービスステータス。
3. データフロー
- ユーザーがiOSアプリで「Riotでサインイン」をタップ。
- アプリが
ASWebAuthenticationSessionでauth.riotgames.comを開く。 - Riotが
https://api.vlgg.net/auth/rso/callbackのCloudflare Workerコールバックにリダイレクト。 - WorkerがOAuthコードをトークンに交換(サーバ側)。Riot client secretはデバイスに渡らない。
- Workerがユーザーのプーイド、Riot ID、有効なVAL shardを取得。
- Workerが独自の7日JWTを発行し、iOSアプリはこれをiOS Keychainに保存。
- 以降のリクエストはJWTを使って
/me/matches、/me/matches/:id、/public/leaderboardを呼び出す。 - WorkerはユーザーのRSO refresh token(AES-GCMで暗号化保存)を使ってRiot Public APIを呼び出す。
4. ポリシー遵守
- スカウト禁止。 アプリで任意のプレイヤーを検索することはできません。サインインしたユーザー本人のマッチのみを表示します。
- リアルタイム優位性なし。 ライブインゲームデータは公開しません。完了したマッチ履歴のみを表示します。
- ゲーム内オーバーレイなし。 独立したiOSアプリで、オーバーレイ・自動化・ゲームクライアント統合はありません。
- RSO opt-inのみ。 Riot Sign Onでの明示的な同意がない限り、ユーザー機能にはアクセスできません。同意がない場合は公開リーダーボードのみ表示。
- 第三者販売なし。 Firebase(匿名のクラッシュ・分析)とAdMob(ATT同意時のIDFA)以外にRiotデータを販売・共有しません。
5. セキュリティ
- RSO refresh tokenはCloudflare D1にAES-GCM(256-bit)で暗号化保存されます。
- OAuthコードとトークンの交換はサーバ側で行われます。Riot
client_secretはiOSアプリに埋め込まれません。 - 独自セッショントークンはHS256で署名され、7日で失効、取り消し可能。
- iOSアプリはセッションJWTをiOS Keychain(
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly)に保存します。 - RiotリダイレクトはカスタムURLスキームではなくUniversal Linksを使用し、コールバックの乗っ取りを防ぎます。
- ユーザー単位のレート制限をサーバ側で適用します。
- ログにはPUUIDのSHA-256ハッシュの先頭8桁のみ記録します。
6. データ保持・削除
- Riotから取得したマッチデータはD1にキャッシュされ、immutableとして扱われます(マッチは終了後変化しない)。
- ログアウト時、refresh tokenは削除され、セッショントークンは取り消されます。
- ユーザーはいつでも soopoly.dev@gmail.com にメールでデータの完全削除を依頼できます。24時間以内に対応します。
7. 開発者
- 開発者: soopoly
- メール: soopoly.dev@gmail.com
- ウェブサイト: https://vlgg.net
- APIキー保有者: 同一開発者。Production Keyも同名義で申請。