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

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

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

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

機密クライアントを使用する場合

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

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

ステップ 1: Authorize URL を構成する App は、App で承認が必要なスコープを指定した authorize URL を X 向けに構築する必要があります。たとえば、App がツイートやユーザーを参照し、フォローを管理する必要がある場合は、次のスコープをリクエストする必要があります。 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_uriauth_code パラメーターを含むリクエストが送信されます。アプリケーション側では state パラメーターを検証する必要があります。 Client からのリダイレクト時のリクエスト例は次のとおりです。
https://www.example.com/?state=state&code=VGNibzFWSWREZm01bjN1N3dicWlNUG1oa2xRRVNNdmVHelJGY2hPWGxNd2dxOjE2MjIxNjA4MjU4MjU6MToxOmFjOjE
ステップ 3: POST oauth2/token - アクセストークン この段階では、認可コードを使用してアクセストークンとリフレッシュトークン (offline.access スコープがリクエストされている場合のみ) を発行できます。次のエンドポイントに対して POST リクエストを送信します。
https://api.x.com/2/oauth2/token
ヘッダーで Content-Type ヘッダーに application/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 を渡す代わりに、前のステップで生成した access token (アクセストークン) を使用します。レスポンスとして、リクエストしているエンドポイントに対応する適切なペイロードが返されます。このリクエストは、public client と confidential client のどちらでも同じです。  実際に送信するリクエストの例は次のとおりです。
curl --location --request GET 'https://api.x.com/2/tweets?ids=1261326399320715264,1278347468690915330' \
--header 'Authorization: Bearer Q0Mzb0VhZ0V5dmNXSTEyNER2MFNfVW50RzdXdTN6STFxQlVkTGhTc1lCdlBiOjE2MjIxNDc3NDM5MTQ6MToxOmF0OjE'
ステップ 5: POST oauth2/token - リフレッシュトークン リフレッシュトークンを使用すると、ユーザーに再認証や操作を求めることなく、アプリケーションが新しいアクセストークンを取得できます。次のエンドポイント https://api.x.com/2/oauth2/token に対して POST リクエストを送信することで、リフレッシュトークンを作成できます。ヘッダーで Content-Type として application/x-www-form-urlencoded を追加する必要があります。さらに、refresh_token を送信し、grant_type を refresh_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 はユーザーではなく App がトークンを失効させるためのものであり、ユーザーを失効させるものではありません。App が自分に付与されたアクセス権をプログラムから取り消したい場合、以下の URL に対して POST リクエストを送信することで revoke token リクエストを作成できます。
https://api.x.com/2/oauth2/revoke
ヘッダーで Content-Typeapplication/x-www-form-urlencoded を指定し、あわせてトークンと client_id を渡す必要があります。 場合によっては、ユーザーが App に付与したアクセスを取り消したいことがあります。その場合は、connected Apps ページ にアクセスして、その 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'