authentic-rb
Ruby clone of @authentic/authentic. A simple library to validate JWTs against JWKs.
Installation
gem install authentic-rb... or with Bundler:
bundle add authentic-rbUsage
Instantiate Authentic::Validator with an options hash, which must contain an iss_whitelist array listing the token.payload.iss values you will accept. For example:
| Provider | Sample iss_whitelist
|
|---|---|
| Auth0 | [ 'https://${tenant}.auth0.com/' ] |
| Okta | [ 'https://${tenant}.oktapreview.com/oauth2/${authServerId}' ] |
There are two basic entry points for validation. ensure_valid and valid. valid basically wraps ensure_valid, catches any errors it raises, and returns a simple boolean for those that prefer that idiom. Here are some examples of both:
Note: JWKs are cached in memory at the instance level. Instantiating a new instance of Authentic::Validator will result in a cold cache, resulting in two HTTP requests to get OIDC config then subsequently the issuer's JWKs. Generally it is best to instantiate this at the Application level thus making use of the JWK cache.
require 'authentic'
# Ensure you pass along your ISS whitelist when instantiating the validator
opts = { iss_whitelist: ['https://articulate.auth0.com/'] }
validator = Authentic::Validator.new(opts)
# Simply returns true or false based on validity
valid = validator.valid?(request.cookies[:token])
# Raises errors when it cannot validate a given token.
begin
# returns the decoded JWT
jwt = validator.ensure_valid(request.cookies[:token])
rescue InvalidToken, InvalidKey, RequestError, ExpiredToken, InvalidIssuer
# do stuff
endResponse Status Codes
According to the OAuth spec invalid or expired tokens should produce a 401 response and insufficient access (either via scope or aud/iss claim) should produce a 403. This means that all errors except InvalidIssuer should produce a 401 status code, and an invalid issuer should produce a 403.
Options
Instantiate Authentic::Validator with an options hash, which must contain an iss_whitelist array listing the token.payload.iss values you will accept. For example:
| Name | Default | Required | Notes |
|---|---|---|---|
| iss_whitelist | N/A | y | |
| cache_max_age | '10h' |
n | Supports seconds, minutes, and hours. Example '10h 30m 60s'
|