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

OAuth 2.0 Authorization Code Flow(PKCE)を使用して endpoint に接続する方法

endpoint への接続方法

ユーザーを認証するには、App で認可フローを実装する必要があります。この認可フローにより、ユーザーを X 上の認可ダイアログに誘導できます。そこから、X の主要エクスペリエンスが認可ダイアログを表示し、App に代わって認可処理を行います。ユーザーは App を許可するか、許可を拒否するかを選択できます。ユーザーが選択を行うと、X はユーザーを App にリダイレクトし、そこで(ユーザーが App を認可した場合は)認可コードを access token と交換するか、(ユーザーが App を認可しなかった場合は)拒否を処理できます。

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

機密クライアントを扱う場合は、トークンendpointにリクエストを送る際、base64エンコードで認可ヘッダーを生成するためにbasic authenticationスキームを使用する必要があります。 useridpassword は、認証情報内のbase64エンコードされた文字列において、コロン(”:“)1文字で区切られます。 例は次のとおりです: -header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA==' ユーザーエージェントがClient ID「Aladdin」とパスワード「open sesame」を送信する場合、次のヘッダーフィールドを使用します: Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== basic authorizationヘッダーを作成するには、Client ID と Client Secret をbase64エンコードする必要があります。これらは、developer portal 内のAppの「Keys and Tokens」ページで取得できます。

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

ステップ 1: Authorize URL を構築する App は、必要なスコープを示して X 向けの authorize URL を組み立てる必要があります。たとえば、App が Tweets とユーザーの参照、さらにフォローの管理を行う必要がある場合、次のスコープをリクエストします: tweet.read%20users.read%20follows.read%20follows.write この URL には、ほかの必須パラメータに加えて code_challenge と state パラメータも含めます。本番環境では、code_challenge にはランダムな文字列を使用してください。 ステップ 2: GET oauth2/authorize ユーザーに認証してもらい、アプリケーションへ認可コードを送信させます。App で OAuth 2.0 を有効にしている場合は、App の「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 スコープを要求している場合のみ)を発行できます。次の endpoint に 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 を使用して endpoint に接続する準備が整いました。接続するには、Bearer Token 認証と同様に API にリクエストします。Bearer Token を送る代わりに、直前のステップで生成した access token を使用します。レスポンスとして、リクエストした endpoint に対応する適切なペイロードが返されます。このリクエストは、パブリッククライアントとコンフィデンシャルクライアントの両方で同一です。 行うリクエストの例は次のとおりです。
curl --location --request GET 'https://api.x.com/2/tweets?ids=1261326399320715264,1278347468690915330' \
--header 'Authorization: Bearer Q0Mzb0VhZ0V5dmNXSTEyNER2MFNfVW50RzdXdTN6STFxQlVkTGhTc1lCdlBiOjE2MjIxNDc3NDM5MTQ6MToxOmF0OjE'
ステップ 5: POST oauth2/token - refresh token refresh token を使用すると、ユーザーに再度の確認を求めることなく、アプリケーションが新しい access token を取得できます。次の endpoint に POST リクエストを送信して refresh token を作成します: https://api.x.com/2/oauth2/token ヘッダーで Content-Typeapplication/x-www-form-urlencoded を設定してください。さらに、refresh_token を渡し、grant_typerefresh_token に設定し、client_id を指定する必要があります。 このリクエストは public クライアントで使用できます:
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 はユーザーではなく App がトークンを失効させるためのものです。App がプログラムで自身に付与されたアクセスを取り消したい場合は、以下の URL に POST リクエストを送信して revoke token リクエストを作成できます。
https://api.x.com/2/oauth2/revoke
ヘッダーで Content-Typeapplication/x-www-form-urlencoded を指定し、トークンと client_id を渡す必要があります。 場合によっては、ユーザーが App に付与したアクセス権を取り消したいことがあります。接続済みの App ページにアクセスして取り消すことができます。
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'
I