Skip to content

Repository files navigation

Build Status Platforms Documentation

Jot

Very simple JWT/JWK library for Swift

There are a lot of really good libraries out there for handling this stuff. However, many of them have the goal of supporting all possible cryptographic algorithms and non-Apple platforms. I just wanted something simple that worked with CryptoKit, so that's what this is.

However, it does abstract the algorithms, so it is possible to use this library with other cryptography systems if you'd like.

This all came from work supporting DPoP as part of OAuth 2.1 in OAuthenticator.

Integration

dependencies: [
    .package(url: "https://github.com/ATProtoKit/Jot", branch: "main")
]

Usage

import Jot

// Define your custom payload. You can omit fields that you do not need.
struct MyCustomPayload: JSONWebTokenPayload {
    let iss: String?
    let sub: String?
    let aud: JSONWebTokenAudience?
    let jti: String?
    let nbf: Date?
    let iat: Date?
    let exp: Date?

    let customClaim: String
}

// create a token
let token = JSONWebToken<MyCustomPayload>(
    header: JSONWebTokenHeader(algorithm: .ES256),
    payload: MyCustomPayload(iss: nil, sub: nil, aud: nil, jti: nil, nbf: nil, iat: nil, exp: nil, customClaim: "my_claim")
)

import CryptoKit

let key = P256.Signing.PrivateKey()

// encode it
let string = token.encode(with: key)

// decode it
let decodedToken = JSONWebToken<MyCustomPayload>(encodedString: string, key: key)

Jot also supports custom signing/verification if CryptoKit is unavailable, or you want to use an algorithm that is does not support.

// custom signature
let string = token.encode { algorithm, data in
    // custom JSONWebTokenSigner implementation goes here

    return signature
}

// custom verification
let token = try JSONWebToken<MyCustomPayload>(encodedString: tokenString) { algorithm, message, signature in
    // custom JSONWebTokenValidator implementation goes here
}

Supported Algorithms

Remember, this library supports bring-your-own-cyptography-system. But, when CryptoKit is available, there are some convenience implementations for ES256, HS256, HS384, HS512. If you need something else open up an issue and we can get it going.

Contributing and Collaboration

I would love to hear from you! Issues or pull requests work great.

I prefer collaboration, and would love to find ways to work together if you have a similar project.

I prefer indentation with tabs for improved accessibility. But, I'd rather you use the system you want and make a PR than hesitate because of whitespace.

By participating in this project you agree to abide by the Contributor Code of Conduct.

About

Very simple JWT/JWK library for Swift

Topics

Resources

Code of conduct

Security policy

Stars

33 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages