class RealSavvy::JWT::AbstractToken

Constants

SCOPE_VERBS

In order of access level

Attributes

token[R]

Public Class Methods

decode(token) click to toggle source

New token, plus makes sure there isn't any errors with the token

# File lib/real_savvy/jwt/abstract_token.rb, line 15
def self.decode(token)
  new(token).tap do |new_token|
    new_token.valid?
  end
end
new(token) click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 9
def initialize(token)
  @token = token
  standardized_token
end
verbs_matches(verb) click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 40
def self.verbs_matches(verb)
  verb_index = SCOPE_VERBS.index(verb)
  verb_index ? SCOPE_VERBS[verb_index..-1] : []
end

Public Instance Methods

audience_is_site?() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 57
def audience_is_site?
  audience.respond_to?(:is_real_savvy_site?) &&
  audience.is_real_savvy_site?
end
claims() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 98
def claims
  retrieve_claims unless @claims
  @claims
end
for_site!() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 49
def for_site!
  for_site? || fail(::RealSavvy::JWT::Unauthorized)
end
for_site?() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 45
def for_site?
  audience_is_site? && subject_is_site?
end
for_user!() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 77
def for_user!
  for_user? || fail(::RealSavvy::JWT::Unauthorized)
end
for_user?() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 53
def for_user?
  audience_is_site? && (subject_is_user? || subject_is_imposter?)
end
header() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 103
def header
  retrieve_claims unless @header
  @header
end
imposter?() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 89
def imposter?
  user
  @imposter ? true : false
end
scope_includes!(*scope_parts) click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 36
def scope_includes!(*scope_parts)
  scope_includes?(*scope_parts) || fail(::RealSavvy::JWT::Unauthorized)
end
scope_includes?(*scope_parts) click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 21
def scope_includes?(*scope_parts)
  !scope_parts.empty? && (
    scope_parts = scope_parts.dup.map(&:to_s)
    verbs_matches = self.class.verbs_matches(scope_parts.pop)

    (0..scope_parts.length).any? do |depth|
      verbs_matches.any? do |verb|
        (scope_parts[0...depth] + [verb]).inject(scopes) do |m, v|
          m&.[](v)
        end
      end
    end
  )
end
scopes() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 123
def scopes
  @scopes ||= raw_scopes.each_with_object({}) do |scope, result|
    scope.split(':').inject(result) { |m, v| m[v] ||= {} }
  end
end
short_token() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 94
def short_token
  @token.split('.')[1]
end
site() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 108
def site
  audience
end
subject_is_imposter?() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 67
def subject_is_imposter?
  subject.respond_to?(:is_real_savvy_imposter?) &&
  subject.is_real_savvy_imposter?
end
subject_is_site?() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 72
def subject_is_site?
  subject.respond_to?(:is_real_savvy_site?) &&
  subject.is_real_savvy_site?
end
subject_is_user?() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 62
def subject_is_user?
  subject.respond_to?(:is_real_savvy_user?) &&
  subject.is_real_savvy_user?
end
user() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 112
def user
  @user ||= begin
              if subject_is_user?
                subject
              elsif subject_is_imposter?
                @imposter = true
                subject.user
              end
            end
end
valid?() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 81
def valid?
  claims && claims.length > 0 && (for_site? || for_user?) && validate_token
end
validate_token() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 85
def validate_token
  raise NotImplementedError, "subclass did not define #validate_token"
end

Private Instance Methods

audience() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 135
def audience
  @audience ||= ::RealSavvy::JWT::Config.retrieve_audience(self) if claims && claims['aud']
end
raw_scopes() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 143
def raw_scopes
  claims&.fetch('scopes', nil).to_a
end
retrieve_claims() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 131
def retrieve_claims
  raise NotImplementedError, "subclass did not define #retrieve_claims"
end
standardized_token() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 147
def standardized_token
  # If token needs to be cleaned up do it here in subclasses
end
subject() click to toggle source
# File lib/real_savvy/jwt/abstract_token.rb, line 139
def subject
  @subject ||= ::RealSavvy::JWT::Config.retrieve_subject(self) if claims && claims['sub']
end