GraphQL APIとのインタラクションセキュリティ: クエリで使用する認証情報の漏洩を防ぐ
セキュリティ: クエリで使用する認証情報の漏洩を防ぐ
GraphQL APIが公開されていない場合(静的サイトを構築する場合など)を除き、GraphQLクエリがプライベートなデータを公開しないよう注意が必要です:
- クエリのレスポンスに含まれる場合
- エラー発生時の出力に含まれる場合
- ログに含まれる場合
例えば、Environment Fieldsモジュールが提供するフィールド_envを使用する以下のクエリは:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...レスポンスに直接認証情報を出力してしまいます:
{
"data": {
"githubAccessToken": "{some access token}"
}
}プラグインのいくつかの機能を使用することで、GraphQLクエリを安全にすることができます:
- Field to Input:動的変数を通じて環境変数の値を別のフィールドに注入する
- @remove Directive:環境変数の値が出力に表示されないようにする
- Send HTTP Request Fields:GraphQLクエリの中から直接外部サービスに接続する
例えば、以下のクエリはプライベートなアクセストークンを使用してGitHubのREST APIに接続します:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
# This directive will remove this entry from the output
@remove
# Create the authorization header to send to GitHub
authorizationHeader: _sprintf(
string: "Bearer %s",
# "Field to Input" feature to access value from the field above
values: [$__githubAccessToken]
)
# Do not print in output
@remove
# Use the field from "Send HTTP Request Fields" to connect to GitHub
gitHubArtifactData: _sendJSONObjectCollectionHTTPRequest(
input: {
url: "https://api.github.com/repos/GatoGraphQL/GatoGraphQL/actions/artifacts",
options: {
headers: [
{
name: "Accept"
value: "application/vnd.github+json"
},
{
name: "Authorization"
# "Field to Input" feature to access value from the field above
value: $__authorizationHeader
},
]
}
}
)
}このクエリでは、機密データを含むフィールドgithubAccessTokenとauthorizationHeaderの両方が出力から削除され、フィールドgitHubArtifactDataはAPIコールの結果のみを表示します。入力値(例:エラー時には変数の値ではなく文字列"$__authorizationHeader"が表示されます)は漏洩しません。