メインコンテンツへスキップ

PKCE を用いた OAuth 2.0 認可コードフローでエンドポイントに接続する方法

エンドポイントへの接続方法

ユーザーを認証するには、アプリで認可フローを実装する必要があります。認可フローでは、ユーザーを X 上の認可ダイアログへ誘導します。以降は、X のメインエクスペリエンスが認可ダイアログを表示し、アプリに代わって認可処理を実行します。ユーザーはアプリを許可するか、権限付与を拒否できます。ユーザーが選択すると、X はユーザーをアプリにリダイレクトし、(ユーザーがアプリを許可した場合は)認可コードをアクセストークンに交換し、(許可されなかった場合は)拒否を処理できます。

機密クライアントの取り扱い

機密クライアントを扱う場合、トークンエンドポイントへのリクエスト時に、Base64 エンコードで認可ヘッダーを生成するためのベーシック認証スキームを使用する必要があります。 useridpassword は、資格情報内の Base64 エンコードされた文字列の中で、コロン(”:“)1文字で区切られます。 例は次のようになります。 -header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA==' ユーザーエージェントが Client ID “Aladdin” と password “open sesame” を送信する場合、次のヘッダーフィールドを使用します。 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== ベーシック認証ヘッダーを作成するには、アプリの「Keys and Tokens」ページ(開発者ポータル 内)で取得できる Client ID と Client Secret を Base64 エンコードする必要があります。

OAuth 2.0 を使用して接続する手順

ステップ 1: Authorize URL を構築する アプリは、必要なスコープを示して X 向けの authorize URL を作成する必要があります。たとえば、アプリで Tweet やユーザーの参照、フォローの管理が必要な場合は、次のスコープをリクエストします。 tweet.read%20users.read%20follows.read%20follows.write この URL には、他の必須パラメータに加えて code_challenge と state パラメータも含めます。本番環境では、code_challenge にはランダムな文字列を使用してください。 ステップ 2: GET oauth2/authorize ユーザーに認証してもらい、アプリに認可コードを送信させます。アプリで OAuth 2.0 を有効にしている場合は、アプリの “Keys and Tokens” ページで Client ID を確認できます。 ユーザーをリダイレクトするための URL の例は次のとおりです。
https://x.com/i/oauth2/authorize?response_type=code&client_id=M1M5R3BMVy13QmpScXkzTUt5OE46MTpjaQ&redirect_uri=https://www.example.com&scope=tweet.read%20users.read%20follows.read%20follows.write&state=state&code_challenge=challenge&code_challenge_method=plain
offline_access を含む URL の例は次のとおりです:
https://x.com/i/oauth2/authorize?response_type=code&client_id=M1M5R3BMVy13QmpScXkzTUt5OE46MTpjaQ&redirect_uri=https://www.example.com&scope=tweet.read%20users.read%20follows.read%20offline.access&state=state&code_challenge=challenge&code_challenge_method=plain
認証に成功すると、redirect_uri に auth_code パラメータを含むリクエストが届きます。アプリは state パラメータを検証する必要があります。 クライアントからのリダイレクト時のリクエスト例は次のとおりです:
https://www.example.com/?state=state&code=VGNibzFWSWREZm01bjN1N3dicWlNUG1oa2xRRVNNdmVHelJGY2hPWGxNd2dxOjE2MjIxNjA4MjU4MjU6MToxOmFjOjE
手順 3: POST oauth2/token - Access Token この時点で、認可コードを使用して Access Token と refresh token(offline.access スコープが要求されている場合のみ)を発行できます。次のエンドポイントに対して POST リクエストを送信します:
https://api.x.com/2/oauth2/token
ヘッダーで Content-Typeapplication/x-www-form-urlencoded を指定する必要があります。さらに、リクエストには codegrant_typeclient_idredirect_uri、および code_verifier を含める必要があります。 以下はパブリッククライアント向けのトークンリクエスト例です。
curl --location --request POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'code=VGNibzFWSWREZm01bjN1N3dicWlNUG1oa2xRRVNNdmVHelJGY2hPWGxNd2dxOjE2MjIxNjA4MjU4MjU6MToxOmFjOjE' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'client_id=rG9n6402A3dbUJKzXTNX4oWHJ' \
--data-urlencode 'redirect_uri=https://www.example.com' \
--data-urlencode 'code_verifier=challenge'
機密クライアントを使用する例は次のとおりです。
curl --location --request POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA=='\
--data-urlencode 'code=VGNibzFWSWREZm01bjN1N3dicWlNUG1oa2xRRVNNdmVHelJGY2hPWGxNd2dxOjE2MjIxNjA4MjU4MjU6MToxOmFjOjE' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'redirect_uri=https://www.example.com' \
--data-urlencode 'code_verifier=challenge'
ステップ 4: API に接続する これで OAuth 2.0 を使用してエンドポイントに接続する準備が整いました。そのためには、Bearer Token 認証 と同様の方法で API にリクエストします。Bearer Token を渡す代わりに、直前のステップで生成したアクセストークンを使用してください。レスポンスとして、リクエストしているエンドポイントに対応する適切なペイロードが返ってくるはずです。このリクエストは、パブリッククライアントと機密クライアントのどちらでも同じです。 送信するリクエストの例は次のとおりです:
curl --location --request GET 'https://api.x.com/2/tweets?ids=1261326399320715264,1278347468690915330' \
--header 'Authorization: Bearer Q0Mzb0VhZ0V5dmNXSTEyNER2MFNfVW50RzdXdTN6STFxQlVkTGhTc1lCdlBiOjE2MjIxNDc3NDM5MTQ6MToxOmF0OjE'
ステップ 5: POST oauth2/token - リフレッシュトークン リフレッシュトークンを使うと、ユーザーに再認可を求めることなく、アプリケーションが新しいアクセストークンを取得できます。次のエンドポイントに POST リクエストを送信して、リフレッシュトークンを作成します: https://api.x.com/2/oauth2/token ヘッダーで Content-Typeapplication/x-www-form-urlencoded を指定してください。あわせて、refresh_token を渡し、grant_typerefresh_token に設定し、client_id を指定する必要があります。 このリクエストはパブリッククライアントで動作します:
POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'refresh_token=bWRWa3gzdnk3WHRGU1o0bmRRcTJ5VUxWX1lZTDdJSUtmaWcxbTVxdEFXcW5tOjE2MjIxNDc3NDM5MTQ6MToxOnJ0OjE' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'client_id=rG9n6402A3dbUJKzXTNX4oWHJ'
機密クライアント向けの例を以下に示します。
POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA=='\
--data-urlencode 'refresh_token=bWRWa3gzdnk3WHRGU1o0bmRRcTJ5VUxWX1lZTDdJSUtmaWcxbTVxdEFXcW5tOjE2MjIxNDc3NDM5MTQ6MToxOnJ0OjE'\
--data-urlencode 'grant_type=refresh_token'
ステップ 6: POST oauth2/revoke - トークンの失効 revoke token は access token または refresh token を無効化します。これはクライアントで「ログアウト」機能を有効にするために用いられ、認可フローに関連付けられ、もはや不要となり得るセキュリティ認証情報を整理(クリーンアップ)することができます。revoke token はユーザーではなく、アプリがトークンを失効させるためのものです。アプリが自身に付与されたアクセスをプログラムから取り消したい場合は、次の URL に POST リクエストを送信して revoke token リクエストを作成できます。
https://api.x.com/2/oauth2/revoke
ヘッダーで Content-Typeapplication/x-www-form-urlencoded を指定し、トークンと client_id を渡す必要があります。 場合によっては、ユーザーがアプリに付与したアクセス権を取り消したいことがあります。接続済みアプリのページにアクセスして取り消すことができます。
curl --location --request POST 'https://api.x.com/2/oauth2/revoke' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'token=Q0Mzb0VhZ0V5dmNXSTEyNER2MFNfVW50RzdXdTN6STFxQlVkTGhTc1lCdlBiOjE2MjIxNDc3NDM5MTQ6MToxOmF0OjE' \
--data-urlencode 'client_id=rG9n6402A3dbUJKzXTNX4oWHJ'
このリクエストは、機密クライアントで有効です。
curl --location --request POST 'https://api.x.com/2/oauth2/revoke' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA=='\
--data-urlencode 'token=Q0Mzb0VhZ0V5dmNXSTEyNER2MFNfVW50RzdXdTN6STFxQlVkTGhTc1lCdlBiOjE2MjIxNDc3NDM5MTQ6MToxOmF0OjE'