Seguridad: evitar exponer credenciales utilizadas en la consulta
A menos que nuestra API GraphQL no esté expuesta públicamente (como cuando construimos un sitio estático), debemos tener cuidado de que la consulta GraphQL no exponga datos privados:
- En la respuesta de la consulta
- En la salida cuando ocurre un error
- En los registros
Por ejemplo, la siguiente consulta que utiliza el campo _env (proporcionado por el módulo Environment Fields):
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...imprimirá directamente las credenciales en la respuesta:
{
"data": {
"githubAccessToken": "{some access token}"
}
}Podemos utilizar varias características del plugin para hacer que la consulta GraphQL sea segura:
- Field to Input para inyectar el valor de entorno en otro campo mediante una variable dinámica
- @remove Directive para evitar imprimir el valor de la variable de entorno en la salida
- Send HTTP Request Fields para conectarse directamente a un servicio externo ya desde dentro de la consulta GraphQL
Por ejemplo, la siguiente consulta se conecta a la API REST de GitHub utilizando un token de acceso privado:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
# Esta directiva eliminará esta entrada de la salida
@remove
# Crear la cabecera de autorización para enviar a GitHub
authorizationHeader: _sprintf(
string: "Bearer %s",
# Característica "Field to Input" para acceder al valor del campo de arriba
values: [$__githubAccessToken]
)
# No imprimir en la salida
@remove
# Usar el campo de "Send HTTP Request Fields" para conectarse a 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"
# Característica "Field to Input" para acceder al valor del campo de arriba
value: $__authorizationHeader
},
]
}
}
)
}En esta consulta, los campos githubAccessToken y authorizationHeader (que contienen datos sensibles) se eliminan ambos de la salida, y el campo gitHubArtifactData ya imprimirá los resultados de la llamada a la API, sin filtrar ninguno de sus inputs (p. ej.: un error imprimirá la cadena "$__authorizationHeader" en lugar del valor de la variable).