Module: SimpleOAuth::Signature
- Defined in:
- lib/simple_oauth/signature.rb,
sig/simple_oauth/signature.rbs
Overview
Signature computation methods for OAuth 1.0
This module provides a registry of signature methods that can be extended with custom implementations. Built-in methods include HMAC-SHA1, HMAC-SHA256, RSA-SHA1, RSA-SHA256, and PLAINTEXT.
Constant Summary collapse
- DEFAULT_DIGEST =
The hash algorithm of the signature methods RFC 5849 defines
"SHA1"
Class Method Summary collapse
-
.decode_base64(data) ⇒ String
Decodes Base64-encoded data.
-
.digest(name) ⇒ String
Returns the hash algorithm a signature method signs with.
-
.encode_base64(data) ⇒ String
Encodes binary data as Base64 without newlines.
-
.register(name, rsa: false, verify: nil, digest: DEFAULT_DIGEST) {|arg0, arg1| ... } ⇒ void
Registers a custom signature method.
-
.registered?(name) ⇒ Boolean
Checks if a signature method is registered.
-
.registered_methods ⇒ Array[String]
Returns list of registered signature method names.
-
.reset! ⇒ void
Resets the registry to only built-in methods.
-
.rsa?(name) ⇒ Boolean
Checks if a signature method uses RSA.
-
.sign(name, secret, signature_base) ⇒ String
Computes a signature using the specified method.
-
.unregister(name) ⇒ void
Unregisters a signature method.
-
.verify(name, key, signature_base, signature) ⇒ Boolean
Verifies a signature against a key and a signature base string.
Class Method Details
.decode_base64(data) ⇒ String
Decodes Base64-encoded data
164 165 166 167 |
# File 'lib/simple_oauth/signature.rb', line 164 def decode_base64(data) # "m" is Base64, and is lenient about characters outside the alphabet data.unpack1("m") #: String end |
.digest(name) ⇒ String
Returns the hash algorithm a signature method signs with
97 98 99 |
# File 'lib/simple_oauth/signature.rb', line 97 def digest(name) fetch(name).fetch(:digest) end |
.encode_base64(data) ⇒ String
Encodes binary data as Base64 without newlines
177 178 179 180 |
# File 'lib/simple_oauth/signature.rb', line 177 def encode_base64(data) # "m0" is Base64 with no line breaks [data].pack("m0") end |
.register(name, rsa: false, verify: nil, digest: DEFAULT_DIGEST) {|arg0, arg1| ... } ⇒ void
This method returns an undefined value.
Registers a custom signature method
50 51 52 |
# File 'lib/simple_oauth/signature.rb', line 50 def register(name, rsa: false, verify: nil, digest: DEFAULT_DIGEST, &block) @registry[normalize_name(name)] = {implementation: block, rsa: rsa, verifier: verify, digest: digest} end |
.registered?(name) ⇒ Boolean
Checks if a signature method is registered
61 62 63 |
# File 'lib/simple_oauth/signature.rb', line 61 def registered?(name) @registry.key?(normalize_name(name)) end |
.registered_methods ⇒ Array[String]
Returns list of registered signature method names
72 73 74 |
# File 'lib/simple_oauth/signature.rb', line 72 def registered_methods @registry.keys end |
.reset! ⇒ void
This method returns an undefined value.
Resets the registry to only built-in methods
151 152 153 154 |
# File 'lib/simple_oauth/signature.rb', line 151 def reset! @registry.clear register_builtin_methods end |
.rsa?(name) ⇒ Boolean
Checks if a signature method uses RSA
85 86 87 |
# File 'lib/simple_oauth/signature.rb', line 85 def rsa?(name) fetch(name).fetch(:rsa) end |
.sign(name, secret, signature_base) ⇒ String
Computes a signature using the specified method
111 112 113 |
# File 'lib/simple_oauth/signature.rb', line 111 def sign(name, secret, signature_base) fetch(name).fetch(:implementation).call(secret, signature_base) end |
.unregister(name) ⇒ void
This method returns an undefined value.
Unregisters a signature method
141 142 143 |
# File 'lib/simple_oauth/signature.rb', line 141 def unregister(name) @registry.delete(normalize_name(name)) end |
.verify(name, key, signature_base, signature) ⇒ Boolean
Verifies a signature against a key and a signature base string
127 128 129 130 131 132 |
# File 'lib/simple_oauth/signature.rb', line 127 def verify(name, key, signature_base, signature) verifier = fetch(name).fetch(:verifier) return OpenSSL.secure_compare(sign(name, key, signature_base), signature) if verifier.nil? verifier.call(key, signature_base, signature) end |