# Python JWT signature example

This example shows how to generate and verify Json Web Tokens (JWT) with Tink.

It demonstrates the basic steps of using Tink, namely loading key material,
obtaining a primitive, and using the primitive to do crypto.

The key material was generated with:

```shell
$ tinkey create-keyset --key-template JWT_ES256 --out-format JSON \
    --out jwt_test_private_keyset.json

$ tinkey create-public-keyset --in jwt_test_private_keyset.json \
  --in-format JSON --out jwt_test_public_keyset.json --out-format JSON
```

Note that these keysets use Tink's JSON keyset format, which is different and
not compatible with JSON Web Key set (JWK set) format.

## Build and run

### Bazel

Build the examples:

```shell
$ git clone https://github.com/google/tink
$ cd tink/python/examples
$ bazel build ...
```

Generate a JWT token using the private keyset:

```shell
$ touch token_file.txt

$ ./bazel-bin/jwt/jwt_sign_cli \
    --private_keyset_path ./jwt/jwt_test_private_keyset.json \
    --audience "audience" --token_path token_file.txt
```

You can convert the public keyset into
[JWK Set](https://datatracker.ietf.org/doc/html/rfc7517#section-5) format. This
is useful if you want to share the public keyset with someone who is not using
Tink. Note that this functionality was added after the release v1.7.0.

```shell
$ touch public_jwk_set.json

$ ./bazel-bin/jwt/jwt_generate_public_jwk_set \
    --public_keyset_path ./jwt/jwt_test_private_keyset.json \
    --public_jwk_set_path public_jwk_set.json
```

You can verify a token using a public keyset given in JWK Set format:

```shell
$ ./bazel-bin/jwt/jwt_verify_cli \
    --public_jwk_set_path public_jwk_set.json \
    --audience "audience" --token_path token_file.txt
```
