Class: Spree::ApiKey
- Inherits:
-
Object
- Object
- Spree::ApiKey
- Defined in:
- app/models/spree/api_key.rb
Constant Summary collapse
- KEY_TYPES =
%w[publishable secret].freeze
- PREFIXES =
{ 'publishable' => 'pk_', 'secret' => 'sk_' }.freeze
- TOKEN_LENGTH =
24- SCOPES =
Admin API authorization scopes. Granted to secret keys at creation; checked by ScopedAuthorization on every admin request. See docs/plans/5.5-admin-api-key-scopes.md for the full design.
%w[ read_orders write_orders read_products write_products read_promotions write_promotions read_customers write_customers read_payments write_payments read_fulfillments write_fulfillments read_refunds write_refunds read_gift_cards write_gift_cards read_store_credits write_store_credits read_stock write_stock read_categories write_categories read_settings write_settings read_webhooks write_webhooks read_api_keys write_api_keys read_dashboard read_all write_all ].freeze
Class Method Summary collapse
-
.compute_token_digest(plaintext) ⇒ String
Computes the HMAC-SHA256 hex digest for a given plaintext token.
-
.find_by_secret_token(plaintext) ⇒ Spree::ApiKey?
Finds an active secret API key by computing the HMAC-SHA256 digest of the provided plaintext token and looking up by
token_digest. -
.hmac_secret ⇒ String
Returns the HMAC secret used for token hashing.
Instance Method Summary collapse
-
#active? ⇒ Boolean
Whether this key has not been revoked.
-
#has_scope?(scope) ⇒ Boolean
Whether this key carries the given scope.
-
#plaintext_token ⇒ String?
Returns the raw token value.
-
#publishable? ⇒ Boolean
Whether this is a publishable (Store API) key.
-
#revoke!(user = nil) ⇒ Boolean
Revokes this API key by setting
revoked_atto the current time. - #scopes=(value) ⇒ Object
-
#secret? ⇒ Boolean
Whether this is a secret (Admin API) key.
Class Method Details
.compute_token_digest(plaintext) ⇒ String
Computes the HMAC-SHA256 hex digest for a given plaintext token.
91 92 93 |
# File 'app/models/spree/api_key.rb', line 91 def self.compute_token_digest(plaintext) OpenSSL::HMAC.hexdigest('SHA256', hmac_secret, plaintext) end |
.find_by_secret_token(plaintext) ⇒ Spree::ApiKey?
Finds an active secret API key by computing the HMAC-SHA256 digest of the provided plaintext token and looking up by token_digest.
80 81 82 83 84 85 |
# File 'app/models/spree/api_key.rb', line 80 def self.find_by_secret_token(plaintext) return nil if plaintext.blank? digest = compute_token_digest(plaintext) active.secret.find_by(token_digest: digest) end |
.hmac_secret ⇒ String
Returns the HMAC secret used for token hashing.
98 99 100 |
# File 'app/models/spree/api_key.rb', line 98 def self.hmac_secret Rails.application.secret_key_base end |
Instance Method Details
#active? ⇒ Boolean
Returns whether this key has not been revoked.
113 114 115 |
# File 'app/models/spree/api_key.rb', line 113 def active? revoked_at.nil? end |
#has_scope?(scope) ⇒ Boolean
Whether this key carries the given scope. ‘write_*` implies the matching `read_*`; `read_all` / `write_all` aliases expand to every read / read+write scope respectively.
131 132 133 134 135 136 137 138 139 |
# File 'app/models/spree/api_key.rb', line 131 def has_scope?(scope) scope = scope.to_s return true if scopes.include?(scope) return true if scope.start_with?('read_') && scopes.include?("write_#{scope.delete_prefix('read_')}") return true if scopes.include?('write_all') return true if scope.start_with?('read_') && scopes.include?('read_all') false end |
#plaintext_token ⇒ String?
Returns the raw token value. For publishable keys this is the persisted token column. For secret keys it is only available in memory immediately after creation (not persisted).
44 45 46 |
# File 'app/models/spree/api_key.rb', line 44 def plaintext_token publishable? ? token : @plaintext_token end |
#publishable? ⇒ Boolean
Returns whether this is a publishable (Store API) key.
103 104 105 |
# File 'app/models/spree/api_key.rb', line 103 def publishable? key_type == 'publishable' end |
#revoke!(user = nil) ⇒ Boolean
Revokes this API key by setting revoked_at to the current time.
121 122 123 |
# File 'app/models/spree/api_key.rb', line 121 def revoke!(user = nil) update!(revoked_at: Time.current, revoked_by: user) end |
#scopes=(value) ⇒ Object
35 36 37 |
# File 'app/models/spree/api_key.rb', line 35 def scopes=(value) super(Array(value).map(&:to_s).reject(&:blank?)) end |
#secret? ⇒ Boolean
Returns whether this is a secret (Admin API) key.
108 109 110 |
# File 'app/models/spree/api_key.rb', line 108 def secret? key_type == 'secret' end |