> ## Documentation Index
> Fetch the complete documentation index at: https://generaltranslation.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

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

<div id="how-to-connect-to-endpoints-using-oauth-20-authorization-code-flow-with-pkce">
  ### PKCE を用いた OAuth 2.0 認可コードフローでエンドポイントに接続する方法
</div>

<div id="how-to-connect-to-the-endpoints">
  #### エンドポイントへの接続方法
</div>

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

<div id="working-with-confidential-clients">
  #### 機密クライアントを使用する場合
</div>

機密クライアントを使用する場合は、トークンエンドポイントにリクエストを送信するとき、Base64 エンコードを用いて Authorization ヘッダーを生成するための [ベーシック認証](https://datatracker.ietf.org/doc/html/rfc2617#section-2)方式を使用する必要があります。

資格情報では、`userid` と `password` は、Base64 エンコードされた文字列内で 1 つのコロン (":") 文字によって区切られます。

例は次のようになります。

`-header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA=='`

ユーザーエージェントが Client ID「Aladdin」とパスワード「open sesame」を送信したい場合、次のヘッダーフィールドを使用します。

`Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==`

ベーシック認証用の Authorization ヘッダーを作成するには、App の [開発者コンソール](https://developer.x.com/en/portal/dashboard) 内の「Keys and Tokens」ページから取得できる Client ID と Client Secret に対して Base64 エンコードを行う必要があります。

<div id="steps-to-connect-using-oauth-20">
  #### OAuth 2.0 を使用して接続する手順
</div>

**ステップ 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_uri` に `auth_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` を指定する必要があります。さらに、リクエストには `code`、`grant_type`、`client_id`、`redirect_uri`、そして `code_verifier` を含める必要があります。

以下はパブリッククライアント向けのトークンリクエストの例です。

```json theme={null}
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'
```

次は、機密クライアントを使用する場合の例です。

```json theme={null}
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 認証](/ja/resources/fundamentals/authentication/oauth-2-0/application-only) を使用する場合と同様に API にリクエストします。Bearer Token を渡す代わりに、前のステップで生成した access token (アクセストークン) を使用します。レスポンスとして、リクエストしているエンドポイントに対応する適切なペイロードが返されます。このリクエストは、public client と confidential client のどちらでも同じです。 

実際に送信するリクエストの例は次のとおりです。

```json theme={null}
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](https://api.x.com/2/oauth2/token) に対して POST リクエストを送信することで、リフレッシュトークンを作成できます。ヘッダーで `Content-Type` として `application/x-www-form-urlencoded` を追加する必要があります。さらに、`refresh_token` を送信し、`grant_type` を `refresh_token` に設定し、`client_id` を指定する必要があります。

このリクエストはパブリッククライアントでも動作します:

```json theme={null}
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'
```

以下は、機密クライアント向けの例です。

```json theme={null}
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-Type` に `application/x-www-form-urlencoded` を指定し、あわせてトークンと client\_id を渡す必要があります。

場合によっては、ユーザーが App に付与したアクセスを取り消したいことがあります。その場合は、[connected Apps ページ](https://x.com/settings/connected_apps) にアクセスして、その App へのアクセスを取り消すことができます。

```bash theme={null}
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'
```

このリクエストは機密クライアントに対して有効です。

```bash theme={null}
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'
```
