OAuthLib: デバイスワークフローが有効なクライアントIDを知っている限り、ベアータokenを取得できます。

### 概要
`"urn:ietf:params:oauth:grant-type:device_code"`のgrant typeと、無効な`device_code`を指定してトークンエンドポイントにリクエストを送信すると、デバイスワークフローが有効なクライアントIDを知っている限り、ベアータokenを取得できてしまいます。

### 詳細

[RFC 8628のセクション3.4](https://datatracker.ietf.org/doc/html/rfc8628#section-3.4)では、トークンエンドポイントは`device_code`を必須パラメータとして受け取るべきであると述べています。`DeviceCodeGrant.validate_token_request`は、`device_code`の検証を行っていません。`DeviceCodeGrant.validate_token_request`は、`device_code`がパラメータとして渡され、かつ有効であるかどうかを検証する必要があります。これは、`AuthorizationCodeGrant.validate_token_request`が行っている検証と同様です。[こちら](https://github.com/oauthlib/oauthlib/blob/a015b446622f2b925517501fe484c10eff7a83c0/oauthlib/oauth2/rfc6749/grant_types/authorization_code.py#L446)および[こちら](https://github.com/oauthlib/oauthlib/blob/a015b446622f2b925517501fe484c10eff7a83c0/oauthlib/oauth2/rfc6749/grant_types/authorization_code.py#L483)。

`RequestValidator`に、`validate_code`メソッドと同様の新しいメソッド`validate_device_code`を追加することを提案します。このメソッドは、`DeviceCodeGrant.validate_token_request`内で呼び出されるべきです。

### 実証
`RequestValidation.authenticate_client`の実装を作成し、クライアントの`client_type`が`"public"`の場合に`True`を返すようにします。これは、`DeviceCodeGrant.validate_token_request`に、パブリッククライアントを適切に処理していないという別の問題があるためです(詳細は[こちら](https://github.com/oauthlib/oauthlib/issues/919))。

`client_type`が`"public"`に設定されたクライアントを作成し、`grant_type`を`"urn:ietf:params:oauth:grant-type:device_code"`に設定します。

`RequestValidation.authenticate_client` の実装が完了したら、そのバリデータを使用してトークンエンドポイントにアクセスしてください。トークンエンドポイントに、以下の内容をボディとして送信します。
```
{
"client_id": <作成したパブリッククライアントのID>,
"grant_type": "urn:ietf:params:oauth:grant-type:device_code",
"device_code": <任意の値を入力してください。なぜなら、検証は行われないからです>
}
```

これで、有効な `device_code` がないにもかかわらず、クライアント用のベアラートークンを取得できます。

### 影響
`oauthlib` で RFC 8628 のデバイスワークフローを使用しているユーザーが、`device_code` パラメータが検証されていないことに気づいていない可能性があります。

影響を受けるパッケージ:
- pip (Python) oauthlib: 影響を受けるバージョンは 3.3.0 以降、4.0.0 未満。4.0.0 で修正済み。