Description
Current Spec
The current spec defines the following:
- secrets have to be listed under
/use/secrets
document: {}
use:
secrets:
- passwordSecret
authentications:
basicTest:
basic:
username: user
password: passwordSecret
-
secrets can be only referenced in authentication policies. (This I couldn't find in the spec but was told by @cdavernas )
-
secrets can contain arbitrary values (e.g. objects)
document: {}
use:
secrets:
- basic.json
authentications:
basicTest:
basic: basic.json
- secrets are simply referenced by name
Some points that in my eyes cause a bit of friction:
Secrets are only available in authentication policies
This was new to me and I don't see it documented anywhere. While I agree that this reduces risk of leakage I don't think it's the best call given that some APIs out there are just weird. (If memory serves right the log intake API of Datadog allows an API key in the query). Currently it's not possible to access secrets in the endpoint/uri
property.
I propose to allow referencing secrets anywhere.
Secrets can contain arbitrary values
document: {}
use:
secrets:
- basic.json
authentications:
basicTest:
basic: basic.json
Here the secret basic.json
replaces an object that contains username
and password
. If we were to allow secrets everywhere this could cause two problems:
- A lot of hidden structure
document: {}
use:
secrets:
- endpointWithApiKey
do:
- getPetById:
call: http
with:
endpoint: endpointWithApiKey
In this I as the reader do not know if the secret is a string just containing the uri, an object of the form {"uri": "..."}
or if it contains a authentication
policy as well. I think this hides a lot of structure from the reader
- everything would have to be
oneOf: [ActualType, string]
If secrets could be referenced everywhere, everything would need to be defined as a string as well. This would produce an ugly and incomprehensible sche,a and also cause a lot of pain for implementers (think OO types of objects or strings).
I propose to limiting secrets to string or primitive values
Referencing secrets
Currently secrets are simply referenced by name: this makes the use of secrets ambiguous. (they become hard to distinguish from a string literal). It also causes cascading effects that might be surprising for example if I start with
document: {}
use:
secrets:
- passwordSecret
authentications:
basicTest:
basic:
username: user
password: passwordSecret
and then delete (or fat-finger) the secret
document: {}
use:
secrets:
- passwordSecrets # accidentally added an "s"
authentications:
basicTest:
basic:
username: user
password: passwordSecret
It would still run and the runtime could not really help me with "Secret not found" because it has to assume that "passwordSecret" is now a string literal.
I therefore propose a more structured way to reference secrets
I see two possibilities here and we might end up using both.
- reference secrets with a
refObject
In line with #904 I would also suggest using an object to reference secrets
document: {}
use:
secrets:
- passwordSecret
authentications:
basicTest:
basic:
username: "user"
password:
use: passwordSecret
as with the linked issue the wording around use
is up for discussion (e.g. use
, ref
, etc...)
$secrets
argument in runtime expressions
Version 0.9 of the spec had the $SECRETS
namespace. I would suggest specifying a $secrets
argument for runtime expressions. It might me necessary to refer to some secrets in runtime expressions. For example some APIs use non standard authentication or headers.
document: {}
do:
- api:
call: http
with:
method: GET
endpoint: https://example.com
headers:
X-Auth: ${ $secrets.username + ":" + $secrets.password | @base64 | "Custom "+ . }
Metadata
Metadata
Assignees
Labels
Type
Projects
Status