Skip to content

NgocHai220998/light_jwt

Repository files navigation

LightJWT

LightJWT is a Ruby implementation of JWT (JSON Web Token) and its related specifications, compliant with RFC 7515 (JWS), RFC 7516 (JWE), RFC 7517 (JWK), RFC 7518 (JWA), and RFC 7519 (JWT) as much as possible.

Installation

Install the gem by running:

gem install light_jwt

Add this line to your application's Gemfile:

gem 'light_jwt'

Then, execute:

bundle install

Features

Signing and Verification

  • Supports HMAC, RSA, and ECDSA with SHA-256, SHA-384, and SHA-512.
  • Includes full support for JWK-based key management.

Encryption and Decryption

  • Supported algorithms include RSA1_5, RSA-OAEP, and AES-GCM (128-bit and 256-bit keys).

JWK and JWKS

  • Fetch and use keys from a JWKS URI.

Supported Algorithms

Purpose Algorithms
Signing HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512
Encryption RSA1_5, RSA-OAEP, A128GCM, A256GCM
None Not supported (planned for future updates).

Usage

Signing

Sign a payload using a private key:

require 'light_jwt'

claims = { sub: '1234567890', name: 'John Doe' }

# Signing
jws = LightJWT::JWT.new(claims).sign('RS256', private_key)
jwt_token = jws.to_s # Outputs: header.payload.signature

Verification

Verify a signed JWT using a public key:

# Verification
jws = LightJWT::JWT.decode(jwt_token, public_key)
payload = jws.payload # Decoded claims: { sub: '1234567890', name: 'John Doe' }

Bypass verification (use only for debugging purposes):

jws = LightJWT::JWT.decode(jwt_token, skip_verification: true)
payload = jws.payload

Using JWK

Fetch and verify using a JWKS URI:

jwk = LightJWT::JWK.new(jwks_uri) # JWKS URI
key = jwk.get(kid)                # Retrieve key by `kid`
jws = LightJWT::JWT.decode(jwt_token, key)
payload = jws.payload

Encryption

Encrypt a payload using a public key:

alg = 'RSA-OAEP'
enc = 'A256GCM'
jwe = LightJWT::JWT.new(claims).encrypt(alg, enc, public_key)
encrypted_token = jwe.to_s # Outputs: header.encrypted_key.iv.ciphertext.auth_tag

Decryption

Decrypt an encrypted JWT using a private key:

jwe = LightJWT::JWT.decode(encrypted_token, private_key)
payload = jwe.payload # Decrypted claims: { sub: '1234567890', name: 'John Doe' }

License

The gem is available as open source under the terms of the MIT License.

About

JSON Web Token implementation in Ruby, compliant with RFC 7519

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published