Usage is simple
import json
from joserf.jwk import KeySet
from idp import IdentityProvider
default_registry = JWSRegistry(algorithms=["RS256", "ES256"])
keyset = KeySet.generate_key_set("EC", "P-256", parameters={"use": "sig"}, count=1)
signer = IdentityProvider(
keyset=keyset,
issuer="https://api.magic.link",
audience="https://auth.magic.link",
registry=default_registry,
)
pub_keyset = keyset.as_dict()
verifier = IdentityProvider(
keyset=pub_keyset,
issuer="https://api.magic.link",
audience="https://auth.magic.link",
registry=default_registry,
)
json.dumps(pub_keyset)
"""
{"keys": [{"crv": "P-256", "x": "RfHAtStGItpu2DUyifoOx2Q28GYNNw_6beO3hoIF2C4", "y": "eIKACTusYm6THys1YkB7mISu30gebWi1E-N6CsvPYXo", "d": "iaCwJ0d6HjAHyzSkCGIfa_hAXLj4d5P-QbLeojJ9lvM", "use": "sig", "kty": "EC", "kid": "lbTHbNZ0ToR8q22VAng_f0ohecrYoOWrt8BXj0A9sLc"}]}
"""
header = signer.build_header()
"""
{'alg': 'ES256',
'typ': 'JWT',
'kid': 'lbTHbNZ0ToR8q22VAng_f0ohecrYoOWrt8BXj0A9sLc'}
"""
base_claims = signer.build_identity_claims(subject="device_profile_id", authorizing_party="auth_user_id")
"""
{'sub': 'device_profile_id', 'azp': 'auth_user_id'}
"""
claims = signer.build_claims(subject="user_id:001", scope="openid", expiry=3600, **base_claims)
"""
{'sub': 'device_profile_id',
'azp': 'auth_user_id',
'iss': 'https://api.magic.link',
'aud': 'https://auth.magic.link',
'scope': 'openid',
'jti': '9799e77c-8011-41db-8921-646496e0872c',
'iat': 1689018283,
'exp': 1689021883}
"""
token = signer.encode(header, claims)
"""
'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImxiVEhiTlowVG9SOHEyMlZBbmdfZjBvaGVjcllvT1dydDhCWGowQTlzTGMifQ.eyJzdWJqZWN0IjoidXNlcl9pZDowMDEiLCJzdWIiOiJkZXZpY2VfcHJvZmlsZV9pZCIsImF6cCI6ImF1dGhfdXNlcl9pZCIsImlzcyI6Imh0dHBzOi8vYXBpLm1hZ2ljLmxpbmsiLCJhdWQiOiJodHRwczovL2F1dGgubWFnaWMubGluayIsInNjb3BlIjoib3BlbmlkIiwianRpIjoiOTc5OWU3N2MtODAxMS00MWRiLTg5MjEtNjQ2NDk2ZTA4NzJjIiwiaWF0IjoxNjg5MDE4MjgzLCJleHAiOjE2ODkwMjE4ODN9.OYoORXx_HURQJiAZmW9XZXvqlu_nhkpF9_d2xPHaaGCd6SJg5a31Go6DpN-HW2l0S1z0Jy44zuHOnMvqPDfgkw'
"""
## Verify/Decode jwt
```python
decoded = verifier.decode(token)
claims_registry = verifier.build_claims_registry()
verifier.validate(token, claims_registry)
decoded.header
"""
{'alg': 'ES256',
'typ': 'JWT',
'kid': 'lbTHbNZ0ToR8q22VAng_f0ohecrYoOWrt8BXj0A9sLc'}
"""
decoded.claims
"""
{'subject': 'user_id:001',
'sub': 'device_profile_id',
'azp': 'auth_user_id',
'iss': 'https://api.magic.link',
'aud': 'https://auth.magic.link',
'scope': 'openid',
'jti': '9799e77c-8011-41db-8921-646496e0872c',
'iat': 1689018283,
'exp': 1689021883}
"""