jsonwebtoken
jsonwebtoken copied to clipboard
Changes for ACME support
Hello, like #9 I'm looking into using this for an ACME implementation. I think a few other changes would be necessary
- Support extra fields in the header, specifically
urlandnonce. I'm not sure the best way to do this. I can think of three options?- Allow embedding Header in other structs as a flat field, and move methods out of that struct. This would probably lose type safety since there's no way to restrict arguments on struct members
- Allow embedding a user struct in Header as a flat field, with generics. You'd still need the generic parameter even if you aren't adding any fields.
- Just add
urlandnonceto Header. Header is already a superset of possible fields, and AFAIK the two main uses of JWT are Oauth2 and ACME so it doesn't seem like a stretch.
- Allow empty payload (in JWS at least) - per the JWT spec the payload can be any octet sequence, but is typically a base64 encoded document. ACME requires it to be
""forPOST for GETin the protocol. - Add a JWS structure and encode/decode methods. I was thinking of
jws.rswithencode_jwsanddecode_jws
These are fairly small changes so I'd be glad to make a PR if it sounds reasonable.
Is it the same thing that I need a nonce header to build the JWT coinbase expects?
https://docs.cloud.coinbase.com/advanced-trade-api/docs/rest-api-auth
From their python example...
jwt_token = jwt.encode(
jwt_payload,
private_key,
algorithm='ES256',
headers={
'kid': key_name,
'nonce': secrets.token_hex()
},
)
The ACME document didn't refer to any other spec so I think it's a coincidence, but I guess if one protocol needs a nonce there are probably others that do too?
IIRC one of the JWT spects talked about making RFCs for header keys, so maybe it is defined somewhere else... sorry, not sure.