Class: Linzer::HTTP::SignatureFeature

Inherits:
HTTP::Feature
  • Object
show all
Defined in:
lib/linzer/http/signature_feature.rb

Overview

Note:

This file must be explicitly required: ‘require “linzer/http/signature_feature”`

HTTP.rb gem feature for automatic request signing.

This feature integrates with the http.rb gem to automatically sign outgoing HTTP requests. It wraps each request before sending and adds the signature and signature-input headers.

Examples:

Basic usage

require "linzer/http/signature_feature"

key = Linzer.generate_ed25519_key("my-key")
response = HTTP
  .use(http_signature: { key: key })
  .get("https://example.com/api")

With custom components and parameters

response = HTTP
  .use(http_signature: {
    key: key,
    covered_components: %w[@method @authority @path date],
    params: { nonce: SecureRandom.hex(16) }
  })
  .post("https://example.com/api", json: { data: "value" })

See Also:

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(key:, params: {}, covered_components: default_components) ⇒ SignatureFeature

Creates a new signature feature.

Parameters:

  • key (Linzer::Key)

    The signing key (required)

  • params (Hash) (defaults to: {})

    Additional signature parameters (created, nonce, tag, etc.)

  • covered_components (Array<String>) (defaults to: default_components)

    Components to include in the signature. Defaults to ‘@method`, `@request-target`, `@authority`, and date.

Raises:

  • (HTTP::Error)

    If key is nil or invalid



58
59
60
61
62
# File 'lib/linzer/http/signature_feature.rb', line 58

def initialize(key:, params: {}, covered_components: default_components)
  @fields = Array(covered_components)
  @key    = validate_key(key)
  @params = Hash(params)
end

Instance Attribute Details

#fieldsArray<String> (readonly)

Returns The components to include in signatures.

Returns:

  • (Array<String>)

    The components to include in signatures



65
66
67
# File 'lib/linzer/http/signature_feature.rb', line 65

def fields
  @fields
end

#paramsHash (readonly)

Returns Additional signature parameters.

Returns:

  • (Hash)

    Additional signature parameters



68
69
70
# File 'lib/linzer/http/signature_feature.rb', line 68

def params
  @params
end

Instance Method Details

#default_covered_componentsArray<String> Also known as: default_components

Returns the default covered components.

Returns:



85
86
87
# File 'lib/linzer/http/signature_feature.rb', line 85

def default_covered_components
  Linzer::Options::DEFAULT[:covered_components]
end

#wrap_request(request) ⇒ HTTP::Request

Wraps an outgoing request to add signature headers.

Called automatically by http.rb for each request.

Parameters:

  • request (HTTP::Request)

    The outgoing request

Returns:

  • (HTTP::Request)

    The request with signature headers added



76
77
78
79
80
81
# File 'lib/linzer/http/signature_feature.rb', line 76

def wrap_request(request)
  message   = Linzer::Message.new(request)
  signature = Linzer.sign(key, message, fields, **params)
  request.headers.merge!(signature.to_h)
  request
end