soar_authentication_token 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Dockerfile +10 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +49 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/keypair-generator +24 -0
- data/bin/setup +8 -0
- data/docker-compose.yml +7 -0
- data/lib/soar_authentication_token/keypair_generator.rb +19 -0
- data/lib/soar_authentication_token/token_generator.rb +42 -0
- data/lib/soar_authentication_token/token_validator.rb +54 -0
- data/lib/soar_authentication_token/version.rb +3 -0
- data/lib/soar_authentication_token.rb +7 -0
- data/sanity/.gitignore +11 -0
- data/sanity/.ruby-gemset +1 -0
- data/sanity/.ruby-version +1 -0
- data/sanity/Gemfile +3 -0
- data/sanity/sanity.rb +55 -0
- data/sanity/sanity_benchmark.rb +83 -0
- data/soar_authentication_token.gemspec +29 -0
- data/spec/keypair_generator_spec.rb +24 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/token_generator_spec.rb +52 -0
- data/spec/token_validator_spec.rb +76 -0
- metadata +170 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3cbc96c1ee8c188201345c363af477c5c885a4e7
|
4
|
+
data.tar.gz: 5a718b299f018d0fac5776c4cb60fbe2fa55e23f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 65eb924547cc77a57909cdab9cb9d2305b8f4f28cfeaad13d01077f30ce2f6aa4511fee72ec0b5dc49709545693f36505db700534edbd7cf429b6cce3b2a88b7
|
7
|
+
data.tar.gz: ee4cce2df468e709959a2520460ce7c3bc63d915d3cf557d3afe3e95bb88f6b192defe62055ef20f33ca1a36e70f7200bf31894d20d811bac21f1923a722385b
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
soar_authentication_token
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.3.0
|
data/Dockerfile
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 Barney de Villiers
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# SoarAuditingProvider
|
2
|
+
|
3
|
+
[](https://badge.fury.io/rb/soar_authentication_token)
|
4
|
+
|
5
|
+
This gem provides authentication token generation and validation capability for the SOAR architecture.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'soar_authentication_token'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install soar_authentication_token
|
22
|
+
|
23
|
+
|
24
|
+
## Testing
|
25
|
+
|
26
|
+
Run the rspec test tests:
|
27
|
+
|
28
|
+
$ docker-compose run --rm soar-authentication-token bundle exec rspec -cfd spec
|
29
|
+
|
30
|
+
|
31
|
+
## Usage
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
## Detailed example
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
## Contributing
|
40
|
+
|
41
|
+
Bug reports and feature requests are welcome by email to barney dot de dot villiers at hetzner dot co dot za. This gem is sponsored by Hetzner (Pty) Ltd (http://hetzner.co.za)
|
42
|
+
|
43
|
+
## Notes
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
## License
|
48
|
+
|
49
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "soar_authentication_token"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "pathname"
|
3
|
+
bin_file = Pathname.new(__FILE__).realpath
|
4
|
+
$:.unshift File.expand_path("../../lib", bin_file)
|
5
|
+
|
6
|
+
require 'soar_authentication_token'
|
7
|
+
require 'yaml'
|
8
|
+
|
9
|
+
class Main
|
10
|
+
|
11
|
+
def generate_keypair
|
12
|
+
#create and configure auditing instance
|
13
|
+
keypair_generator = SoarAuthenticationToken::KeypairGenerator.new
|
14
|
+
private_key, public_key = keypair_generator.generate
|
15
|
+
configuration = {
|
16
|
+
'private_key' => private_key,
|
17
|
+
'public_key' => public_key
|
18
|
+
}
|
19
|
+
print configuration.to_yaml
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
main = Main.new
|
24
|
+
main.generate_keypair
|
data/bin/setup
ADDED
data/docker-compose.yml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
|
3
|
+
module SoarAuthenticationToken
|
4
|
+
class KeypairGenerator
|
5
|
+
def initialize
|
6
|
+
end
|
7
|
+
|
8
|
+
def generate
|
9
|
+
private_key = OpenSSL::PKey::EC.new 'secp521r1'
|
10
|
+
private_key.generate_key
|
11
|
+
public_key = OpenSSL::PKey::EC.new private_key
|
12
|
+
public_key.private_key = nil
|
13
|
+
[private_key.to_pem, public_key.to_pem]
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'soar_xt'
|
2
|
+
require 'jwt'
|
3
|
+
|
4
|
+
module SoarAuthenticationToken
|
5
|
+
class TokenGenerator
|
6
|
+
DEFAULT_CONFIGURATION = {
|
7
|
+
:mode => 'local',
|
8
|
+
:private_key => '',
|
9
|
+
:url => ''
|
10
|
+
} unless defined? DEFAULT_CONFIGURATION; DEFAULT_CONFIGURATION.freeze
|
11
|
+
|
12
|
+
def initialize(configuration)
|
13
|
+
@configuration = merge_with_default_configuration(configuration)
|
14
|
+
validate_configuration
|
15
|
+
@private_key = OpenSSL::PKey::EC.new(@configuration[:private_key])
|
16
|
+
end
|
17
|
+
|
18
|
+
def generate(authenticated_identifier:)
|
19
|
+
encode(payload(authenticated_identifier))
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def payload(authenticated_identifier)
|
25
|
+
{ 'authenticated_identifier' => authenticated_identifier,
|
26
|
+
'issue_time' => Time.now.utc.iso8601(3),
|
27
|
+
'nounce' => SecureRandom.hex(32)
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def encode(payload)
|
32
|
+
JWT.encode(payload, @private_key, 'ES512')
|
33
|
+
end
|
34
|
+
|
35
|
+
def validate_configuration
|
36
|
+
end
|
37
|
+
|
38
|
+
def merge_with_default_configuration(configuration)
|
39
|
+
Hash.deep_merge(DEFAULT_CONFIGURATION,configuration)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'soar_xt'
|
2
|
+
require 'jwt'
|
3
|
+
|
4
|
+
module SoarAuthenticationToken
|
5
|
+
class TokenValidator
|
6
|
+
DEFAULT_CONFIGURATION = {
|
7
|
+
:mode => 'local',
|
8
|
+
:public_key => '',
|
9
|
+
:url => ''
|
10
|
+
} unless defined? DEFAULT_CONFIGURATION; DEFAULT_CONFIGURATION.freeze
|
11
|
+
|
12
|
+
def initialize(configuration)
|
13
|
+
@configuration = merge_with_default_configuration(configuration)
|
14
|
+
validate_configuration
|
15
|
+
@public_key = OpenSSL::PKey::EC.new(@configuration[:public_key])
|
16
|
+
@public_key.private_key = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def validate(authentication_token)
|
20
|
+
return validate_locally(authentication_token) if 'local' == @configuration[:mode]
|
21
|
+
return validate_remotely(authentication_token)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def validate_locally(authentication_token)
|
27
|
+
decoded_token_payload = decode(authentication_token)
|
28
|
+
return [false, nil] if expired?(decoded_token_payload[0]['issue_time'])
|
29
|
+
[true, decoded_token_payload[0]['authenticated_identifier']]
|
30
|
+
rescue JWT::VerificationError, JWT::DecodeError
|
31
|
+
[false, nil]
|
32
|
+
end
|
33
|
+
|
34
|
+
def validate_remotely(authentication_token)
|
35
|
+
[true, 'uuid']
|
36
|
+
end
|
37
|
+
|
38
|
+
def validate_configuration
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
def merge_with_default_configuration(configuration)
|
43
|
+
Hash.deep_merge(DEFAULT_CONFIGURATION,configuration)
|
44
|
+
end
|
45
|
+
|
46
|
+
def decode(authentication_token)
|
47
|
+
JWT.decode(authentication_token, @public_key, true, { :algorithm => 'ES512' })
|
48
|
+
end
|
49
|
+
|
50
|
+
def expired?(issue_time)
|
51
|
+
(Time.parse(issue_time) + 604800) < Time.now #TODO make this configurable
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/sanity/.gitignore
ADDED
data/sanity/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
sanity
|
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.3.0
|
data/sanity/Gemfile
ADDED
data/sanity/sanity.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'soar_authentication_token'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
class Main
|
5
|
+
|
6
|
+
def generate_keypair
|
7
|
+
#create and configure auditing instance
|
8
|
+
keypair_generator = SoarAuthenticationToken::KeypairGenerator.new
|
9
|
+
private_key, public_key = keypair_generator.generate
|
10
|
+
configuration = {
|
11
|
+
'private_key' => private_key,
|
12
|
+
'public_key' => public_key
|
13
|
+
}
|
14
|
+
print configuration.to_yaml
|
15
|
+
end
|
16
|
+
|
17
|
+
def round_trip_simple_code
|
18
|
+
$stderr.puts "Generating Keypair..."
|
19
|
+
$ecdsa_key = OpenSSL::PKey::EC.new 'secp521r1'
|
20
|
+
$ecdsa_key.generate_key
|
21
|
+
$ecdsa_public = OpenSSL::PKey::EC.new $ecdsa_key
|
22
|
+
$ecdsa_public.private_key = nil
|
23
|
+
$stderr.puts "Generation Complete"
|
24
|
+
|
25
|
+
$stderr.puts 'DIRECT'
|
26
|
+
json_stuff = { 'stuff' => 'bla' }
|
27
|
+
token = encode(json_stuff)
|
28
|
+
result = decode(token)
|
29
|
+
$stderr.puts result
|
30
|
+
|
31
|
+
extracted_private_key = $ecdsa_key.to_pem
|
32
|
+
extracted_public_key = $ecdsa_public.to_pem
|
33
|
+
$ecdsa_key = nil
|
34
|
+
$ecdsa_public = nil
|
35
|
+
|
36
|
+
$stderr.puts 'INDIRECT'
|
37
|
+
$ecdsa_key = OpenSSL::PKey::EC.new extracted_private_key
|
38
|
+
$ecdsa_public = OpenSSL::PKey::EC.new ''#extracted_public_key
|
39
|
+
token = encode(json_stuff)
|
40
|
+
result = decode(token)
|
41
|
+
$stderr.puts result
|
42
|
+
end
|
43
|
+
|
44
|
+
def encode(payload)
|
45
|
+
JWT.encode(payload, $ecdsa_key, 'ES512')
|
46
|
+
end
|
47
|
+
|
48
|
+
def decode(authentication_token)
|
49
|
+
JWT.decode(authentication_token, $ecdsa_public, true, { :algorithm => 'ES512' })
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
main = Main.new
|
54
|
+
main.generate_keypair
|
55
|
+
main.round_trip_simple_code
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'soar_auditing_provider'
|
2
|
+
require 'log4r_auditor'
|
3
|
+
require 'soar_flow'
|
4
|
+
require 'benchmark'
|
5
|
+
require 'byebug'
|
6
|
+
|
7
|
+
class Main
|
8
|
+
|
9
|
+
AUDITING_CONFIGURATION = {
|
10
|
+
'auditing' => {
|
11
|
+
'level' => 'debug',
|
12
|
+
'install_exit_handler' => 'false',
|
13
|
+
'add_caller_source_location' => 'false',
|
14
|
+
'queue_worker' => {
|
15
|
+
'queue_size' => 1000000,
|
16
|
+
'initial_back_off_in_seconds' => 1,
|
17
|
+
'back_off_multiplier' => 2,
|
18
|
+
'back_off_attempts' => 5
|
19
|
+
},
|
20
|
+
'default_nfrs' => {
|
21
|
+
'accessibility' => 'local',
|
22
|
+
'privacy' => 'not encrypted',
|
23
|
+
'reliability' => 'instance',
|
24
|
+
'performance' => 'high'
|
25
|
+
},
|
26
|
+
'auditors' => {
|
27
|
+
'log4r' => {
|
28
|
+
'adaptor' => 'Log4rAuditor::Log4rAuditor',
|
29
|
+
'file_name' => 'soar_sc.log',
|
30
|
+
'standard_stream' => 'none',
|
31
|
+
'nfrs' => {
|
32
|
+
'accessibility' => 'local',
|
33
|
+
'privacy' => 'not encrypted',
|
34
|
+
'reliability' => 'instance',
|
35
|
+
'performance' => 'high'
|
36
|
+
}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
def test_sanity
|
43
|
+
iterations = 1000000
|
44
|
+
|
45
|
+
#create and configure auditing instance
|
46
|
+
myauditing = SoarAuditingProvider::AuditingProvider.new( AUDITING_CONFIGURATION['auditing'] )
|
47
|
+
myauditing.startup_flow_id = SoarFlow::ID::generate_flow_id
|
48
|
+
myauditing.service_identifier = 'my-test-service.com'
|
49
|
+
|
50
|
+
#associate a set of auditing entries with a flow by generating a flow identifiers
|
51
|
+
flow_id = SoarFlow::ID::generate_flow_id
|
52
|
+
|
53
|
+
Benchmark.bm do |x|
|
54
|
+
myauditing = SoarAuditingProvider::AuditingProvider.new( AUDITING_CONFIGURATION['auditing'].dup.merge("level" => "warn") )
|
55
|
+
myauditing.startup_flow_id = SoarFlow::ID::generate_flow_id
|
56
|
+
myauditing.service_identifier = 'my-test-service.com'
|
57
|
+
x.report ("audit_call_below_audit_threshold:") {
|
58
|
+
iterations.times {
|
59
|
+
myauditing.info("Benchmarking test",flow_id)
|
60
|
+
}
|
61
|
+
}
|
62
|
+
myauditing = SoarAuditingProvider::AuditingProvider.new( AUDITING_CONFIGURATION['auditing'].dup.merge("add_caller_source_location" => "false") )
|
63
|
+
myauditing.startup_flow_id = SoarFlow::ID::generate_flow_id
|
64
|
+
myauditing.service_identifier = 'my-test-service.com'
|
65
|
+
x.report ("audit_call_without_caller_info :") {
|
66
|
+
iterations.times {
|
67
|
+
myauditing.info("Benchmarking test",flow_id)
|
68
|
+
}
|
69
|
+
}
|
70
|
+
myauditing = SoarAuditingProvider::AuditingProvider.new( AUDITING_CONFIGURATION['auditing'].dup.merge("add_caller_source_location" => "true") )
|
71
|
+
myauditing.startup_flow_id = SoarFlow::ID::generate_flow_id
|
72
|
+
myauditing.service_identifier = 'my-test-service.com'
|
73
|
+
x.report ("audit_call_with_caller_info :") {
|
74
|
+
iterations.times {
|
75
|
+
myauditing.info("Benchmarking test",flow_id)
|
76
|
+
}
|
77
|
+
}
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
main = Main.new
|
83
|
+
main.test_sanity
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'soar_authentication_token/version'
|
5
|
+
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = "soar_authentication_token"
|
9
|
+
spec.version = SoarAuthenticationToken::VERSION
|
10
|
+
spec.authors = ["Barney de Villiers"]
|
11
|
+
spec.email = ["barney.de.villiers@hetzner.co.za"]
|
12
|
+
spec.description = %q{Interface to the authentication token service}
|
13
|
+
spec.summary = %q{Client library for Hetzner's authentication token service}
|
14
|
+
spec.homepage = "https://gitlab.host-h.net/hetznerZA/authentication-token-service"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files`.split($/)
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_dependency 'soar_xt', '~> 0.0.3'
|
23
|
+
spec.add_dependency 'jwt', '~> 1.5', '>= 1.5.6'
|
24
|
+
|
25
|
+
spec.add_development_dependency 'pry', '~> 0'
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 2.13"
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SoarAuthenticationToken::KeypairGenerator do
|
4
|
+
before :each do
|
5
|
+
@iut = SoarAuthenticationToken::KeypairGenerator.new
|
6
|
+
end
|
7
|
+
|
8
|
+
after :each do
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'has a version number' do
|
12
|
+
expect(SoarAuthenticationToken::VERSION).not_to be nil
|
13
|
+
end
|
14
|
+
|
15
|
+
context "when generating a new keypair" do
|
16
|
+
it 'should provide the eliptic curve public and private key in pem format' do
|
17
|
+
private_key, public_key = @iut.generate
|
18
|
+
expect(private_key).to include('-----BEGIN EC PRIVATE KEY-----')
|
19
|
+
expect(private_key).to include('-----END EC PRIVATE KEY-----')
|
20
|
+
expect(public_key).to include('-----BEGIN PUBLIC KEY-----')
|
21
|
+
expect(public_key).to include('-----END PUBLIC KEY-----')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SoarAuthenticationToken::TokenGenerator do
|
4
|
+
before :all do
|
5
|
+
keypair_generator = SoarAuthenticationToken::KeypairGenerator.new
|
6
|
+
@private_key, @public_key = keypair_generator.generate
|
7
|
+
end
|
8
|
+
|
9
|
+
before :each do
|
10
|
+
generator_configuration = {
|
11
|
+
:mode => 'local',
|
12
|
+
:private_key => @private_key
|
13
|
+
}
|
14
|
+
validator_configuration = {
|
15
|
+
:mode => 'local',
|
16
|
+
:public_key => @public_key
|
17
|
+
}
|
18
|
+
@iut = SoarAuthenticationToken::TokenGenerator.new(generator_configuration)
|
19
|
+
@validator = SoarAuthenticationToken::TokenValidator.new(validator_configuration)
|
20
|
+
end
|
21
|
+
|
22
|
+
after :each do
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'has a version number' do
|
26
|
+
expect(SoarAuthenticationToken::VERSION).not_to be nil
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when generating a new token locally" do
|
30
|
+
it 'should provide token using configured private key' do
|
31
|
+
|
32
|
+
#binding.pry
|
33
|
+
token = @iut.generate(authenticated_identifier: 'a@b.co.za')
|
34
|
+
print @validator.validate(token)
|
35
|
+
print @validator.validate("asdfasdf")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when generating a new token locally" do
|
40
|
+
it 'should provide token using the configured private key' do
|
41
|
+
#TODO
|
42
|
+
#expect(true).to eq false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when generating a new token remotely" do
|
47
|
+
it 'should provide token using the configured remote service' do
|
48
|
+
#TODO
|
49
|
+
#expect(true).to eq false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
describe SoarAuthenticationToken::TokenValidator do
|
5
|
+
before :all do
|
6
|
+
keypair_generator = SoarAuthenticationToken::KeypairGenerator.new
|
7
|
+
@valid_private_key, @valid_public_key = keypair_generator.generate
|
8
|
+
@invalid_private_key, @invalid_public_key = keypair_generator.generate
|
9
|
+
@test_identifier = 'a@b.co.za'
|
10
|
+
@valid_generator_configuration = {
|
11
|
+
:mode => 'local',
|
12
|
+
:private_key => @valid_private_key
|
13
|
+
}
|
14
|
+
@invalid_generator_configuration = {
|
15
|
+
:mode => 'local',
|
16
|
+
:private_key => @invalid_private_key
|
17
|
+
}
|
18
|
+
@validator_configuration = {
|
19
|
+
:mode => 'local',
|
20
|
+
:public_key => @valid_public_key
|
21
|
+
}
|
22
|
+
@valid_generator = SoarAuthenticationToken::TokenGenerator.new(@valid_generator_configuration)
|
23
|
+
@invalid_generator = SoarAuthenticationToken::TokenGenerator.new(@invalid_generator_configuration)
|
24
|
+
end
|
25
|
+
|
26
|
+
before :each do
|
27
|
+
@iut = SoarAuthenticationToken::TokenValidator.new(@validator_configuration)
|
28
|
+
end
|
29
|
+
|
30
|
+
after :each do
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'has a version number' do
|
34
|
+
expect(SoarAuthenticationToken::VERSION).not_to be nil
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when validating a token locally using the configured public key" do
|
38
|
+
it 'should indicate valid if the token is valid' do
|
39
|
+
token = @valid_generator.generate(authenticated_identifier: @test_identifier)
|
40
|
+
token_validity, token_identifier = @iut.validate(token)
|
41
|
+
expect(token_validity).to eq true
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should indicate invalid if the token is invalid' do
|
45
|
+
token = @invalid_generator.generate(authenticated_identifier: @test_identifier)
|
46
|
+
token_validity, token_identifier = @iut.validate(token)
|
47
|
+
expect(token_validity).to eq false
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should provide the authenticated_identifier if the token is valid' do
|
51
|
+
token = @valid_generator.generate(authenticated_identifier: @test_identifier)
|
52
|
+
token_validity, token_identifier = @iut.validate(token)
|
53
|
+
expect(token_identifier).to eq @test_identifier
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should not provide the authenticated_identifier if the token is invalid' do
|
57
|
+
token = @invalid_generator.generate(authenticated_identifier: @test_identifier)
|
58
|
+
token_validity, token_identifier = @iut.validate(token)
|
59
|
+
expect(token_identifier).to eq nil
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should indicate as invalid tokens that are older than the configured expiry time' do
|
63
|
+
#TODO
|
64
|
+
#expect(true).to eq false
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should indicate as valid tokens that are not older than the configured expiry time' do
|
68
|
+
#TODO
|
69
|
+
#expect(true).to eq false
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "when validating a token remotely using the configured url" do
|
74
|
+
#TODO
|
75
|
+
end
|
76
|
+
end
|
metadata
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: soar_authentication_token
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Barney de Villiers
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-11-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: soar_xt
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.0.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.0.3
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jwt
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.5'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 1.5.6
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1.5'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.5.6
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: pry
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: bundler
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '1.3'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '1.3'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rake
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '10.0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '10.0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: rspec
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '2.13'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '2.13'
|
103
|
+
description: Interface to the authentication token service
|
104
|
+
email:
|
105
|
+
- barney.de.villiers@hetzner.co.za
|
106
|
+
executables:
|
107
|
+
- console
|
108
|
+
- keypair-generator
|
109
|
+
- setup
|
110
|
+
extensions: []
|
111
|
+
extra_rdoc_files: []
|
112
|
+
files:
|
113
|
+
- ".gitignore"
|
114
|
+
- ".rspec"
|
115
|
+
- ".ruby-gemset"
|
116
|
+
- ".ruby-version"
|
117
|
+
- Dockerfile
|
118
|
+
- Gemfile
|
119
|
+
- LICENSE.txt
|
120
|
+
- README.md
|
121
|
+
- Rakefile
|
122
|
+
- bin/console
|
123
|
+
- bin/keypair-generator
|
124
|
+
- bin/setup
|
125
|
+
- docker-compose.yml
|
126
|
+
- lib/soar_authentication_token.rb
|
127
|
+
- lib/soar_authentication_token/keypair_generator.rb
|
128
|
+
- lib/soar_authentication_token/token_generator.rb
|
129
|
+
- lib/soar_authentication_token/token_validator.rb
|
130
|
+
- lib/soar_authentication_token/version.rb
|
131
|
+
- sanity/.gitignore
|
132
|
+
- sanity/.ruby-gemset
|
133
|
+
- sanity/.ruby-version
|
134
|
+
- sanity/Gemfile
|
135
|
+
- sanity/sanity.rb
|
136
|
+
- sanity/sanity_benchmark.rb
|
137
|
+
- soar_authentication_token.gemspec
|
138
|
+
- spec/keypair_generator_spec.rb
|
139
|
+
- spec/spec_helper.rb
|
140
|
+
- spec/token_generator_spec.rb
|
141
|
+
- spec/token_validator_spec.rb
|
142
|
+
homepage: https://gitlab.host-h.net/hetznerZA/authentication-token-service
|
143
|
+
licenses:
|
144
|
+
- MIT
|
145
|
+
metadata: {}
|
146
|
+
post_install_message:
|
147
|
+
rdoc_options: []
|
148
|
+
require_paths:
|
149
|
+
- lib
|
150
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - ">="
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0'
|
155
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
requirements: []
|
161
|
+
rubyforge_project:
|
162
|
+
rubygems_version: 2.5.1
|
163
|
+
signing_key:
|
164
|
+
specification_version: 4
|
165
|
+
summary: Client library for Hetzner's authentication token service
|
166
|
+
test_files:
|
167
|
+
- spec/keypair_generator_spec.rb
|
168
|
+
- spec/spec_helper.rb
|
169
|
+
- spec/token_generator_spec.rb
|
170
|
+
- spec/token_validator_spec.rb
|