require 'json/jwt' require 'rack/prx_auth/certificate' require 'rack/prx_auth/token_data' require 'rack/prx_auth/auth_validator' require 'prx_auth' module Rack class PrxAuth INVALID_TOKEN = [ 401, {'Content-Type' => 'application/json'}, [{status: 401, error: 'Invalid JSON Web Token'}.to_json] ] DEFAULT_ISS = 'id.prx.org' attr_reader :issuer def initialize(app, options = {}) @app = app @certificate = Certificate.new(options[:cert_location]) @issuer = options[:issuer] || DEFAULT_ISS end def build_auth_validator(token) AuthValidator.new(token, @certificate, @issuer) end def call(env) return @app.call(env) unless env['HTTP_AUTHORIZATION'] token = env['HTTP_AUTHORIZATION'].split[1] auth_validator = build_auth_validator(token) return @app.call(env) unless should_validate_token?(auth_validator) if auth_validator.valid? env['prx.auth'] = TokenData.new(auth_validator.claims) @app.call(env) else INVALID_TOKEN end end private def should_validate_token?(auth_validator) auth_validator.token_issuer_matches? end end end