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, profile: nil) ⇒ 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`.

  • profile (Symbol, Linzer::Signature::Profile::Base, nil) (defaults to: nil)

    Optional signing profile used when generating signatures. When provided, the profile may supply default covered components and signature parameters.

Raises:

  • (HTTP::Error)

    If key is nil or invalid



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

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

Instance Attribute Details

#fieldsArray<String> (readonly)

Returns The components to include in signatures.

Returns:

  • (Array<String>)

    The components to include in signatures



70
71
72
# File 'lib/linzer/http/signature_feature.rb', line 70

def fields
  @fields
end

#paramsHash (readonly)

Returns Additional signature parameters.

Returns:

  • (Hash)

    Additional signature parameters



73
74
75
# File 'lib/linzer/http/signature_feature.rb', line 73

def params
  @params
end

#profileLinzer::Signature::Profile::Base, ... (readonly)

Returns Optional signing profile used during signature generation.

Returns:



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

def profile
  @profile
end

Instance Method Details

#default_covered_componentsArray<String> Also known as: default_components

Returns the default covered components.

Returns:



96
97
98
# File 'lib/linzer/http/signature_feature.rb', line 96

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



85
86
87
88
89
90
91
92
# File 'lib/linzer/http/signature_feature.rb', line 85

def wrap_request(request)
  Linzer.sign! request,
               key:        key,
               components: fields,
               params:     params,
               profile:    profile
  request
end