Open Cloud は、クライアントが機密か公開かにかかわらず、OAuth 2.0 の認証フローをサポートします。
- 機密クライアント は、秘密を保管し、端末のバックエンドで安全に保存して取得できるウェブサイトなど、クレジデンシャルを機密に保つアプリです。
- 公開クライアント は、モバイルやウェブブラウザなどのアプリと同様、秘密を保持できないアプリです。
私たちは、すべてのクライアントに対して PKCE で OAuth 2.0 の認証コードの流を推奨し、公開クライアントに必要とすることを要求します。
認証コードのフローを実装するには、アプリは次のステップを実行します:
- コード検証機とコードチャレンジを生成します(PKCE のみ)。これにより、クライアントの秘密を含める代わりにチャレンジを要求に含めることができます。これにより、セキュリティが向上します。
- Authorization エンドポイントに適切なパラメータで GET リクエストを送信します。
- アーチャーコールバックを処理します。 アーチャーを取得した後、Roblox から指定した URL にリダイレクトリクエストするために、アーチャーコードを使用してください。後で使用するためにアーチャーコールバックをパースします。
- トークンエンドポイントに POST リクエストを送信します。如果成功、あなたはアクセスと更新トークンを受信し、API コールを実行するために使用できます。
- アクセスしたいリソースのリファレンスドキュメントに基づいて、OAuth 2.0 認証をサポートする任意のオープンクラウド API を呼び出します。
次のセクションでは、それぞれのステップをより深く説明します。
コードチャレンジを生成する (PKCE のみ)
認証プロセスを開始する前に、コードチャレンジをコード検証機から生成する必要があります。ライブラリまたはプログラミング言語の選択でライブラリを使用して、コードチャレンジを作成し、ハッシュを計算し、ベース64 エンコードを生成してコードチャレンジを生成できます。
コードバーチャル空間を作成するときは、大小文字(A-Z、a-z、装置(0-9、hyphen (-、期間(.)、underscore (_、tilde () など)、装置(0-9、hyphen (- など)、装飾(_ など)、および挿入文字( など)を使用して、最小 43 文字、最大 128 文字の長さを持つこと。
次の例では、Javascript を使用してコードの検証機を作成し、SHA-256 ハッシュアルゴリズムを使用してコードチャレンジを生成する方法を示しています:
Generate Code Challenge
const crypto = require('crypto');
// base64URL encode the verifier and challenge
function base64URLEncode(str) {
return str.toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
}
// create sha256 hash from code verifier
function sha256(buffer) {
return crypto.createHash('sha256').update(buffer).digest(`base64`);
// create a random code verifier
var code_verifier = base64URLEncode(crypto.randomBytes(32));
// generate a challenge from the code verifier
var code_challenge = base64URLEncode(sha256(code_verifier));
PKCE の場合、コード検証とチャレンジ値が後のステップで必要です。
Authorization URL を構築する
ユーザーの認可プロセスを開始するには、必要なパラメータでユーザー認可 URL を構築します:
- client_id : アプリのクライアント ID は、アプリの登録後 に取得されます。
- redirect_uri : アプリのリダイレクション UI、アプリの再入場ポイント。
- scope : アプリのアクセス権をスペース区切りのリストで定義するリクエストされたスコープ。
- response_type : オーライトコードのフローを指示するために code に設定します。 PKCE のみに必要
- code_challenge : コード検証機から生成されたコードチャレンジ。
- code_challenge_method : このパラメーター値を S256 に設定して、コードチャレンジが SHA-256 アルゴリズムを使用して変換されたことを示すために使用されています。
- state : リクエストとコールバックの間で状態を維持するオペークな安全ランダム値。 PKCE 以外の場合は必要ない
- client_secret : アプリのクライアントシークレットは、アプリの登録後 に取得できます。PKCE を使用している場合は、このパラメータを省略します。あなたのアービューリングリクエスト URL は、次の例のように形式が整っている必要があります:
PKCE のアーチャーメント URL の例
https://apis.roblox.com/oauth/v1/authorize?client_id=7290610391231237934964&code_challenge=PLEKKVCjdD1V_07wOKlAm7P02NC-LZ_1hQfdu5XSXEI&code_challenge_method=S256&redirect_uri=https://example.com/redirect&scope=openid%20profile&response_type=code&state=abc123
ユーザーが URL を訪問すると、認証フローを通過します。成功すると、Roblox はユーザーを指定の redirect_uri にリダイレクトします。
処理アースローバック
認可フローが成功すると、アプリは GET リクエストを Roblox の認可サーバー (redirect_uri 指定の) から受信します。リクエストでは、code (認可コード) と 1> state1> (以前に提供した値の場合) のパラメーターが含まれています。
code パラメータには、アプリがアーバリゼーションサーバーからアクセストークンに交換できる認証コードが含まれています。ほとんどのバックエンドサーバー言語には、デコンポジットオブジェクトのクエリーパラメータにアクセスするための標準的な方法があります。あなたは code パラメータを取得し、アクセ
state パラメーターは、オーソリストリクエストで提供したオペーク値です。このパラメーターを使用して、オーソリストプロセスの状態またはコンテキストを維持できます。
たとえば、GET リクエストを受信した場合、https://example.com/redirect にリダイレクトしたリンクを指定した場合、
赤信号の URL の例
https://example.com/redirect?code=10c45PNuquKnFJ6pUcy5-fHkghEM6lSegm-7hj9mVEprub1dSDuStuKK_EAUXY7AHTD63xcnmvxSLthp-C8g3jzIGZVzuXSd20Y2dEYI9hx0LZmPg95ME4z2K03UheiZbroyXUjYyB3ReoMqobzDVPzyx6IS8kj2Uu-11Xq_0JiTYxtDatuqXRNIAmJT8gMJmbSyOLOP_vnDvbeMUiBsqCRrkTGVbWSwYSc8sTVVE-535kYdqQOgNjH1ffCoZLGl8YYxLnpb2CXJlRQPrcjkA&state=6789
認証に失敗すると、アプリは指定されたリディレクション URL に GET リクエストを受信し、error、error_description および 2>state2> (できる場合) パラメータを含む。
- Error パラメータは、オーソリゼーションプロセス中に発生した特定の OAuth 2.0 エラーを指します。
- error_description パラメーターは、エラーの追加詳細を提供します。
- state パラメータは、アプリが失敗の場合に状態を維持するのに役立ちます。
認証コードをアクセストークンに交換する
当該者の権限 code をパーセルした場合、そのトークンを交換して、必要な Roblox リソースにアクセスできます:
アクセストークンをリクエストし、POST をトークンエクスチェンジ端末に送信して、アクセストークンを更新します。リクエストには、 認可コード、クライアント ID、コード検証値 (PKCE) またはクライアントの秘密 (非 PKCE) が含まれている必要があります。 x-www-form-urlencoded
受信した応答から適用可能なトークンを抽出します。アクセストークンは 15 分間有効です。ストアリングを安全に保つために、通常はサーバー側でトークンを更新します。
トークンエンドポイントの例の応答{"access_token": "eyJhbGciOiJFUzI1NiIsImtpZCI6IlBOeHhpb2JFNE8zbGhQUUlUZG9QQ3FCTE81amh3aXZFS1pHOWhfTGJNOWMiLCJ0eXAiOiJKV11234.eyJzdWIiOiIyMDY3MjQzOTU5IiwiYWlkIjoiM2Q2MWU3NDctM2ExNS00NTE4LWJiNDEtMWU3M2VhNDUyZWIwIiwic2NvcGUiOiJvcGVuaWQ6cmVhZCBwcm9maWxlOnJlYWQiLCJqdGkiOiJBVC5QbmFWVHpJU3k2YkI5TG5QYnZpTCIsIm5iZiI6MTY5MTYzOTY5OCwiZXhwIjoxNjkxNjQwNTk4LCJpYXQiOjE2OTE2Mzk2OTgsImlzcyI6Imh0dHBzOi8vYXBpcy5yb2Jsb3guY29tL29hdXRoLyIsImF1ZCI6IjcyOTA2MTAzOTc5ODc5MzQ5Nj1234.BjwMkC8Q5a_iP1Q5Th8FrS7ntioAollv_zW9mprF1ats9CD2axCvupZydVzYphzQ8TawunnYXp0Xe8k0t8ithg","refresh_token": "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwia2lkIjoidGpHd1BHaURDWkprZEZkREg1dFZ5emVzRWQyQ0o1NDgtUi1Ya1J1TTBBRSIsInR5cCI6IkpXVCJ9..nKYZvjvXH6msDG8Udluuuw.PwP-_HJIjrgYdY-gMR0Q3cabNwIbmItcMEQHx5r7qStVVa5l4CbrKwJvjY-w9xZ9VFb6P70WmXndNifnio5BPZmivW5QkJgv5_sxLoCwsqB1bmEkz2nFF4ANLzQLCQMvQwgXHPMfCK-lclpVEwnHk4kemrCFOvfuH4qJ1V0Q0j0WjsSU026M67zMaFrrhSKwQh-SzhmXejhKJOjhNfY9hAmeS-LsLLdszAq_JyN7fIvZl1fWDnER_CeDAbQDj5K5ECNOHAQ3RemQ2dADVlc07VEt2KpSqUlHlq3rcaIcNRHCue4GfbCc1lZwQsALbM1aSIzF68klXs1Cj_ZmXxOSOyHxwmbQCHwY7aa16f3VEJzCYa6m0m5U_oHy84iQzsC-_JvBaeFCachrLWmFY818S-nH5fCIORdYgc4s7Fj5HdULnnVwiKeQLKSaYsfneHtqwOc_ux2QYv6Cv6Xn04tkB2TEsuZ7dFwPI-Hw2O30vCzLTcZ-Fl08ER0J0hhq4ep7B641IOnPpMZ1m0gpJJRPbHX_ooqHol9zHZ0gcLKMdYy1wUgsmn_nK_THK3m0RmENXNtepyLw_tSd5vqqIWZ5NFglKSqVnbomEkxneEJRgoFhBGMZiR-3FXMaVryUjq-N.Q_t4NGxTUSMsLVEppkTu0Q6rwt2rKJfFGuvy3s12345","token_type": "Bearer","expires_in": 899,"id_token": "eyJhbGciOiJFUzI1NiIsImtpZCI6IkNWWDU1Mi1zeWh4Y1VGdW5vNktScmtReFB1eW15YTRQVllodWdsd3hnNzgiLCJ0eXAiOiJKV11234.eyJzdWIiOiIyMDY3MjQzOTU5IiwibmFtZSI6ImxpbmtzZ29hdCIsIm5pY2tuYW1lIjoibGlua3Nnb2F0IiwicHJlZmVycmVkX3VzZXJuYW1lIjoibGlua3Nnb2F0IiwiY3JlYXRlZF9hdCI6MTYwNzM1NDIzMiwicHJvZmlsZSI6Imh0dHBzOi8vd3d3LnJvYmxveC5jb20vdXNlcnMvMjA2NzI0Mzk1OS9wcm9maWxlIiwibm9uY2UiOiIxMjM0NSIsImp0aSI6IklELnltd3ZjTUdpOVg4azkyNm9qd1I5IiwibmJmIjoxNjkxNjM5Njk4LCJleHAiOjE2OTE2NzU2OTgsImlhdCI6MTY5MTYzOTY5OCwiaXNzIjoiaHR0cHM6Ly9hcGlzLnJvYmxveC5jb20vb2F1dGgvIiwiYXVkIjoiNzI5MDYxMDM5Nzk4NzkzNDk2NCJ9.kZgCMJQGsariwCi8HqsUadUBMM8ZOmf_IPDoWyQY9gVX4Kx3PubDz-Q6MvZ9eU5spNFz0-PEH-G2WSvq2ljDyg","scope": "openid profile"}
リソースメソッドへの呼び出し
必要なアクセストークンを入手したので、リソースメソッドへのアウトバウンドを認証するために使用できます。すべての API リクエストのヘッダーにアクセストークンを含めて、リソースメソッドを認証します。
たとえば、アプリが正しく機能しているかどうかテストするには、すべてのアライバルフローを通過してから、アクセストークンで GET リクエストを USER_INFプロフィール に行うことで、openid 機能をテストできます。ユ
ユーザー情報の例の返信
{
"sub": "12345678",
"name": "Jane Doe",
"nickname": "robloxjanedoe",
"preferred_username": "robloxjanedoe",
"created_at": 1607354232,
"profile": "https://www.roblox.com/users/12345678/profile"
}