class MagicAdmin::Resource::Token

The token resource and its methods are accessible on the Magic instance by the Token attribute. It provides methods to interact with the DID Token.

Public Instance Methods

construct_issuer_with_public_address(public_address) click to toggle source

Description:

Method parse public_address and extract issuer

Arguments:

public_address: Cryptographic public address of the Magic User.

Returns:

issuer info
# File lib/magic-admin/resource/token.rb, line 64
def construct_issuer_with_public_address(public_address)
  "did:ethr:#{public_address}"
end
decode(did_token) click to toggle source

Description:

Method Decodes a DID Token from a Base64 string into
a tuple of its individual components: proof and claim.
This method allows you decode the DID Token
and inspect the token

Arguments:

did_token: A DID Token generated by a Magic user on the client-side.

Returns:

An array containing proof and claim or raise an error
# File lib/magic-admin/resource/token.rb, line 42
def decode(did_token)
  proof = nil
  claim = nil
  begin
    token_array = JSON.parse(base64_decode(did_token))
    proof = token_array[0]
    claim = JSON.parse(token_array[1])
    validate_claim_fields!(claim)
  rescue JSON::ParserError, ArgumentError
    raise DIDTokenError, "DID Token is malformed"
  end
  [proof, claim]
end
get_issuer(did_token) click to toggle source

Description:

Method parse did_token and extract issuer

Arguments:

did_token: A DID Token generated by a Magic user on the client-side.

Returns:

issuer info
# File lib/magic-admin/resource/token.rb, line 76
def get_issuer(did_token)
  decode(did_token).last["iss"]
end
get_public_address(did_token) click to toggle source

Description:

Method parse did_token and extract  cryptographic public_address

Arguments:

did_token: A DID Token generated by a Magic user on the client-side.

Returns:

cryptographic public address of the Magic User
who generated the supplied DID Token.
# File lib/magic-admin/resource/token.rb, line 89
def get_public_address(did_token)
  get_issuer(did_token).split(":").last
end
validate(did_token) click to toggle source

Description:

Method validate did_token

Arguments:

did_token: A DID Token generated by a Magic user on the client-side.

Returns:

true or raise an error
# File lib/magic-admin/resource/token.rb, line 20
def validate(did_token)
  time = Time.now.to_i
  proof, claim = decode(did_token)
  rec_address = rec_pub_address(claim, proof)

  validate_public_address!(rec_address, did_token)
  validate_claim_fields!(claim)
  validate_claim_ext!(time, claim["ext"])
  validate_claim_nbf!(time, claim["nbf"])
end

Private Instance Methods

apply_nbf_grace_period(claim_nbf) click to toggle source
# File lib/magic-admin/resource/token.rb, line 133
def apply_nbf_grace_period(claim_nbf)
  claim_nbf - MagicAdmin::Config.nbf_grace_period
end
base64_decode(did_token) click to toggle source
# File lib/magic-admin/resource/token.rb, line 95
def base64_decode(did_token)
  Base64.urlsafe_decode64(did_token)
end
claim_fields() click to toggle source
# File lib/magic-admin/resource/token.rb, line 107
def claim_fields
  %w[iat ext iss sub aud nbf tid]
end
personal_recover(claim, proof) click to toggle source
# File lib/magic-admin/resource/token.rb, line 99
def personal_recover(claim, proof)
  Eth::Key.personal_recover(JSON.dump(claim), proof)
end
rec_pub_address(claim, proof) click to toggle source
# File lib/magic-admin/resource/token.rb, line 103
def rec_pub_address(claim, proof)
  Eth::Utils.public_key_to_address personal_recover(claim, proof)
end
validate_claim_ext!(time, claim_ext) click to toggle source
# File lib/magic-admin/resource/token.rb, line 126
def validate_claim_ext!(time, claim_ext)
  return true unless time > claim_ext

  message = "Given DID token has expired. Please generate a new one."
  raise DIDTokenError, message
end
validate_claim_fields!(claim) click to toggle source
# File lib/magic-admin/resource/token.rb, line 111
def validate_claim_fields!(claim)
  missing_fields = claim_fields - claim.keys
  return true unless missing_fields.any?

  message = "DID Token missing required fields: %s"
  raise DIDTokenError, message % missing_fields.join(", ")
end
validate_claim_nbf!(time, claim_nbf) click to toggle source
# File lib/magic-admin/resource/token.rb, line 137
def validate_claim_nbf!(time, claim_nbf)
  return true unless time < apply_nbf_grace_period(claim_nbf)

  message = "Given DID token cannot be used at this time."
  raise DIDTokenError, message
end
validate_public_address!(rec_address, did_token) click to toggle source
# File lib/magic-admin/resource/token.rb, line 119
def validate_public_address!(rec_address, did_token)
  return true if rec_address.eql? get_public_address(did_token)

  message = "Signature mismatch between 'proof' and 'claim'."
  raise DIDTokenError, message
end