Bezpieczeństwo: unikanie ujawniania danych uwierzytelniających używanych w query
O ile nasze API GraphQL nie jest publicznie niedostępne (na przykład podczas budowania strony statycznej), musimy uważać, aby query GraphQL nie ujawniało prywatnych danych:
- W odpowiedzi query
- W danych wyjściowych, gdy wystąpi błąd
- W logach
Na przykład następująca query używająca pola _env (dostarczonego przez moduł Environment Fields):
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...wydrukuje dane uwierzytelniające bezpośrednio w odpowiedzi:
{
"data": {
"githubAccessToken": "{some access token}"
}
}Możemy skorzystać z kilku funkcji wtyczki, aby uczynić query GraphQL bezpiecznym:
- Field to Input — aby wstrzyknąć wartość środowiskową do innego pola za pośrednictwem zmiennej dynamicznej
- @remove Directive — aby uniknąć drukowania wartości zmiennej środowiskowej w danych wyjściowych
- Send HTTP Request Fields — aby połączyć się bezpośrednio z zewnętrzną usługą już z poziomu query GraphQL
Na przykład następująca query łączy się z interfejsem API REST GitHub przy użyciu prywatnego tokenu dostępu:
{
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
},
]
}
}
)
}W tej query pola githubAccessToken i authorizationHeader (zawierające wrażliwe dane) są oba usuwane z danych wyjściowych, a pole gitHubArtifactData wydrukuje już wyniki wywołania API bez ujawniania żadnych danych wejściowych (np. błąd wydrukuje ciąg "$__authorizationHeader" zamiast wartości zmiennej).