JSON Patch secrets into appsettings.json

JSON Patch secrets into appsettings.json Background
3 min read

Another useful feature in the ServiceStack x dotnet tool I wanted to highlight is its built-in support for JSON Patching. This feature provides you with a robust mechanism for modifying your JSON files, providing a precise and granular way to manage configurations, that's especially useful when automating changes from a continuous integration environment.

What is JSON Patching?

JSON Patch, as specified in RFC 6902, is a format for expressing a sequence of operations to apply to a JSON document. It allows us to add, remove, replace, copy, move and test elements within the JSON structure, making it a versatile tool in managing and altering configurations.

Here's a quick overview of the supported operations:

Operation Notes
add Adds a new property or array element. For an existing property, it sets a new value.
remove Removes a property or array element.
replace Same as 'remove' followed by 'add' at the same location.
move Same as 'remove' from the source followed by 'add' to the destination using the value from the source.
copy Same as 'add' to the destination using the value from the source.
test Returns a success status code if the value at the path equals the provided value.

The x dotnet tool implements these operations, making it a handy utility for managing your JSON configurations.

An Example with SMTP Settings

Let's dive into a practical example. We'll be working with an appsettings.json file, a common sight in .NET projects, which often houses sensitive settings like SMTP config. Suppose we have the following structure with an empty smtp object:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "smtp": {}
}

We need to fill this smtp object with settings such as username, password, host, port, and more. To automate filling these values, we can use the ServiceStack x tool to apply a json.patch.

The json.patch file to accomplish this would look something like:

[
  {
    "op": "add",
    "path": "/smtp",
    "value": {
      "UserName": "AWS_ACCESS_KEY_ID",
      "Password": "AWS_SECRET_ACCESS_KEY",
      "Host": "email-smtp.us-east-1.amazonaws.com",
      "Port": 587,
      "From": "email address",
      "FromName": "From Name",
      "Bcc": "bcc email address"
    }
  }
]

Once this patch is applied, our appsettings.json transforms into:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "smtp": {
    "UserName": "AWS_ACCESS_KEY_ID",
    "Password": "AWS_SECRET_ACCESS_KEY",
    "Host": "email-smtp.us-east-1.amazonaws.com",
    "Port": 587,
    "From": "email address",
    "FromName": "From Name",
    "Bcc": "bcc email address"
  }
}

You can apply this patch using the x tool's patch command:

x patch appsettings.json.patch

This expects both the appsettings.json.patch and appsettings.json files to be local. Optionally, you can specify both files if their names differ.

x patch changes.json.patch appsettings.json

Using in CI Environments

Another significant benefit of this feature is the convenience it provides in CI environments, such as GitHub Actions. Secrets and other environment-specific configurations often need to be injected during the CI process. This is where JSON patching can be extremely useful.

Consider the following step in a GitHub Actions workflow:

- name: Apply SMTP Settings
  working-directory: ./MyApp
  run: | 
    cat <<EOF >> appsettings.json.patch
    ${‎{ secrets.APPSETTINGS_PATCH}‎}
    EOF
    x patch appsettings.json.patch

Here, the SMTP settings are stored securely as GitHub secrets as JSON patch syntax, and then added to the appsettings.json file during the CI process using the x tool. This ensures that sensitive data like your SMTP password remains secure and is not hardcoded into your app's source code.

Wrapping Up

The ability to use JSON Patch files to manipulate JSON data adds a powerful tool to your .NET developer toolkit. Whether you're managing complex configurations or securing sensitive data in CI processes, ServiceStack's x dotnet tool and its JSON Patching feature gives you an easier way to automate changes to JSON files.