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