説明
個別のAPI操作の security にAPIキー認証を指定することは、有効な構成です。ただし、暗号化されないHTTPでその操作を呼び出すと通信中にキーが漏えいする可能性があるため、HTTPSが必要です。
想定される影響
漏えいしたキーを入手した人が、そのキーに許可されたAPI操作を実行する可能性があります。
対処方法
対象の操作のサーバーとクライアントでHTTPSを必須にし、キーはURLではなくヘッダーで送信してください。文書と実際の認証ポリシーを一致させ、ログにキーが残らないようにしてください。漏えいしたキーは失効させて再発行してください。
例
次のOpenAPI 3.0の抜粋では、/pets 操作のAPIサーバーURLをHTTPSに変更し、認証をOAuth2に切り替える選択肢を示しています。OAuth2だけではAPI通信は暗号化されません。APIキーを維持してHTTPSとヘッダーを使うこともできます。実際のサーバーとクライアントにも適用してください。
変更前
json
{
"openapi": "3.0.0",
"servers": [{"url": "http://api.example.com"}],
"paths": {
"/pets": {
"post": {
"security": [
{
"apiKeyAuth": []
}
]
}
}
},
"components": {
"securitySchemes": {
"apiKeyAuth": {
"type": "apiKey",
"name": "X-API-Key",
"in": "query"
}
}
}
}
変更後
json
{
"openapi": "3.0.0",
"servers": [{"url": "https://api.example.com"}],
"paths": {
"/pets": {
"post": {
"security": [
{
"OAuth2": [
"write",
"read"
]
}
]
}
}
},
"components": {
"securitySchemes": {
"OAuth2": {
"type": "oauth2",
"flows": {
"authorizationCode": {
"authorizationUrl": "https://example.com/oauth/authorize",
"tokenUrl": "https://example.com/oauth/token",
"scopes": {
"write": "modify objects in your account",
"read": "read objects in your account"
}
}
}
}
}
}
}