class Magiclink::Token
Attributes
claim[R]
Public Class Methods
new(claim)
click to toggle source
# File lib/magiclink/token.rb, line 11 def initialize(claim) @claim = claim end
parse!(token)
click to toggle source
# File lib/magiclink/token.rb, line 5 def self.parse!(token) validate!(token) _, claim = decode!(token) new(claim) end
Private Class Methods
check_required_fields(claim)
click to toggle source
# File lib/magiclink/token.rb, line 75 def self.check_required_fields(claim) missing_fields = [] @@required_fields.each do |field| if !claim.key?(field) missing_fields << field end end if missing_fields.any? raise Exception.new 'DID Token missing required fields: %s' % missing_fields.join(", ") end end
decode!(token)
click to toggle source
# File lib/magiclink/token.rb, line 51 def self.decode!(token) begin decoded_did_token = JSON.parse(Base64.urlsafe_decode64(token)) rescue Exception raise Exception.new 'Malformed DID Token' end if decoded_did_token.length != 2 raise Exception.new 'DID Token is malformed' end proof = decoded_did_token[0] begin claim = JSON.parse(decoded_did_token[1]) rescue Exception raise Exception.new 'DID Token is malformed' end self.check_required_fields(claim) return proof, claim end
validate!(token)
click to toggle source
# File lib/magiclink/token.rb, line 28 def self.validate!(token) proof, claim = self.decode!(token) recovered_public_address = Eth::Utils.public_key_to_address( Eth::Key.personal_recover(JSON.dump(claim), proof), ) if recovered_public_address != new(claim).public_address raise Exception.new "Signature mismatch between 'proof' and 'claim'." end current_time = Time.now.to_i if current_time > claim['ext'] raise Exception.new 'Given DID token has expired. Please generate a new one.' end if current_time < claim['nbf'] raise Exception.new 'Given DID token cannot be used at this time.' end true end
Public Instance Methods
issuer()
click to toggle source
# File lib/magiclink/token.rb, line 20 def issuer return claim['iss'] end
public_address()
click to toggle source
# File lib/magiclink/token.rb, line 15 def public_address # This can also use regex to parse it. return issuer.split(':')[-1] end