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.
dependencies: [
.package(url: "https://github.com/mattmassicotte/Jot", branch: "main")
]
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
}
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.
I would love to hear from you! Issues or pull requests work great. Both a Matrix space and Discord are available for live help, but I have a strong bias towards answering in the form of documentation. You can also find me on the web.
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.