akamai-authtoken 0.4.0
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/lib/akamai/authtoken.rb +161 -0
- metadata +44 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c1d6b93d6b4ddac65963b2a51b60ad4c003f79a7
|
4
|
+
data.tar.gz: b0c1e74bd7c1b55ceb4f50ea31735a391b9125db
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 934edf4bc3495870db8fab8aa8b27d7b69daff39fb62da7d40fe9834385986e924d4dae34313d8e03e29486d7acf392d2396d06ec16163b0bba7abd933bbb3e9
|
7
|
+
data.tar.gz: 7a66faa06156f420af5e8c31acdb3740b0a66266c738782dfded6337e923b88be119d242492b38c0ec5a5dc510c0e1061ab25139f2d5893613e6473d0130876c
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require 'openssl'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
|
6
|
+
ENV['TZ'] = 'GMT'
|
7
|
+
|
8
|
+
module Akamai
|
9
|
+
class AuthTokenError < Exception
|
10
|
+
"""Base-class for all exceptions raised by AuthToken Class"""
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
class AuthToken
|
15
|
+
attr_accessor :token_type, :token_name, :key, :algorithm, :salt,
|
16
|
+
:start_time, :end_time, :window_secondse, :field_delimiter,
|
17
|
+
:acl_delimiter, :escape_early, :verbose
|
18
|
+
|
19
|
+
def initialize(token_type: nil, token_name: '__token__', key: nil,
|
20
|
+
algorithm: 'sha256', salt: nil, start_time: nil, end_time: nil,
|
21
|
+
window_seconds: nil, field_delimiter: '~', acl_delimiter: '!',
|
22
|
+
escape_early: false, verbose: false)
|
23
|
+
|
24
|
+
@token_type = token_type
|
25
|
+
@token_name = token_name
|
26
|
+
@start_time = start_time
|
27
|
+
@end_time = end_time
|
28
|
+
@window_seconds = window_seconds
|
29
|
+
if !key || key.length <= 0
|
30
|
+
raise AuthTokenError,
|
31
|
+
'You must provide a secret in order to generate a new token.'
|
32
|
+
end
|
33
|
+
@key = key
|
34
|
+
@algorithm = algorithm
|
35
|
+
@salt = salt
|
36
|
+
@field_delimiter = field_delimiter
|
37
|
+
@acl_delimiter = acl_delimiter
|
38
|
+
@escape_early = escape_early
|
39
|
+
@verbose = verbose
|
40
|
+
end
|
41
|
+
|
42
|
+
def _escapeEarly(text)
|
43
|
+
if @escape_early
|
44
|
+
return CGI::escape(text).gsub(/(%..)/) {$1.downcase}
|
45
|
+
else
|
46
|
+
return text
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def generateToken(url: nil, acl: nil, start_time: nil, end_time: nil, window_seconds: nil,
|
51
|
+
ip: nil, payload: nil, session_id: nil)
|
52
|
+
|
53
|
+
if !start_time
|
54
|
+
start_time = @start_time
|
55
|
+
end
|
56
|
+
if !end_time
|
57
|
+
end_time = @end_time
|
58
|
+
end
|
59
|
+
if !window_seconds
|
60
|
+
window_seconds = @window_seconds
|
61
|
+
end
|
62
|
+
|
63
|
+
if start_time.to_s.downcase == 'now'
|
64
|
+
start_time = Time.new.getgm.to_i
|
65
|
+
elsif start_time && !(start_time.is_a? Integer)
|
66
|
+
raise AuthTokenError, 'start_time must be numeric or now'
|
67
|
+
end
|
68
|
+
|
69
|
+
if end_time && !(end_time.is_a? Integer)
|
70
|
+
raise AuthTokenError, 'end_time must be numeric or now'
|
71
|
+
end
|
72
|
+
|
73
|
+
if window_seconds && !(window_seconds.is_a? Integer)
|
74
|
+
raise AuthTokenError, 'window_seconds must be numeric or now'
|
75
|
+
end
|
76
|
+
|
77
|
+
if !end_time
|
78
|
+
if window_seconds.to_i > 0
|
79
|
+
if !start_time
|
80
|
+
end_time = Time.new.getgm.to_i + window_seconds
|
81
|
+
else
|
82
|
+
end_time = start_time + window_seconds
|
83
|
+
end
|
84
|
+
else
|
85
|
+
raise AuthTokenError, 'You must provide an expiration time or a duration window..'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
if start_time && end_time < start_time
|
90
|
+
raise AuthTokenError, 'Token will have already expired.'
|
91
|
+
end
|
92
|
+
|
93
|
+
if (!acl && !url) || (acl && url)
|
94
|
+
raise AuthTokenError, 'You must provide a URL or an ACL'
|
95
|
+
end
|
96
|
+
|
97
|
+
if @verbose
|
98
|
+
puts "Akamai Token Generation Parameters"
|
99
|
+
puts "Token Type : #{@token_type}"
|
100
|
+
puts "Token Name : #{@token_name}"
|
101
|
+
puts "Start Time : #{start_time}"
|
102
|
+
puts "End Time : #{end_time}"
|
103
|
+
puts "Window(seconds) : #{window_seconds}"
|
104
|
+
puts "IP : #{ip}"
|
105
|
+
puts "URL : #{url}"
|
106
|
+
puts "ACL : #{acl}"
|
107
|
+
puts "Key/Secret : #{@key}"
|
108
|
+
puts "Payload : #{payload}"
|
109
|
+
puts "Algo : #{@algo}"
|
110
|
+
puts "Salt : #{@salt}"
|
111
|
+
puts "Session ID : #{session_id}"
|
112
|
+
puts "Field Delimiter : #{@field_delimiter}"
|
113
|
+
puts "ACL Delimiter : #{@acl_delimiter}"
|
114
|
+
puts "Escape Early : #{@escape_early}"
|
115
|
+
end
|
116
|
+
|
117
|
+
hash_code = Array.new
|
118
|
+
new_token = Array.new
|
119
|
+
|
120
|
+
if ip
|
121
|
+
new_token.push('ip=%s' % _escapeEarly(ip))
|
122
|
+
end
|
123
|
+
if start_time
|
124
|
+
new_token.push('st=%s' % start_time)
|
125
|
+
end
|
126
|
+
new_token.push('exp=%s' % end_time)
|
127
|
+
|
128
|
+
if acl
|
129
|
+
new_token.push('acl=%s' % acl)
|
130
|
+
end
|
131
|
+
if session_id
|
132
|
+
new_token.push('id=%s' % _escapeEarly(session_id))
|
133
|
+
end
|
134
|
+
if payload
|
135
|
+
new_token.push('data=%s' % _escapeEarly(payload))
|
136
|
+
end
|
137
|
+
|
138
|
+
hash_code = new_token.clone
|
139
|
+
|
140
|
+
if url and !acl
|
141
|
+
hash_code.push('url=%s' % _escapeEarly(url))
|
142
|
+
end
|
143
|
+
|
144
|
+
if @salt
|
145
|
+
hash_code.push('salt=%s' % @salt)
|
146
|
+
end
|
147
|
+
if !(['sha256', 'sha1', 'md5'].include? @algorithm)
|
148
|
+
raise AuthTokenError, 'Unknown algorithm'
|
149
|
+
end
|
150
|
+
|
151
|
+
bin_key = Array(@key.gsub(/\s/,'')).pack("H*")
|
152
|
+
digest = OpenSSL::Digest.new(@algorithm)
|
153
|
+
token_hmac = OpenSSL::HMAC.new(bin_key, digest)
|
154
|
+
token_hmac.update(hash_code.join(@field_delimiter))
|
155
|
+
|
156
|
+
new_token.push('hmac=%s' % token_hmac)
|
157
|
+
|
158
|
+
return new_token.join(@field_delimiter)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
metadata
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: akamai-authtoken
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Astin Choi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-03-09 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Akamai-AuthToken is Akamai Authorization Token for Ruby 2.0+
|
14
|
+
email: achoi@akamai.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/akamai/authtoken.rb
|
20
|
+
homepage: https://github.com/AstinCHOI/AkamaiAuthToken-Ruby
|
21
|
+
licenses:
|
22
|
+
- Apache
|
23
|
+
metadata: {}
|
24
|
+
post_install_message:
|
25
|
+
rdoc_options: []
|
26
|
+
require_paths:
|
27
|
+
- lib
|
28
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2.0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
requirements: []
|
39
|
+
rubyforge_project:
|
40
|
+
rubygems_version: 2.6.8
|
41
|
+
signing_key:
|
42
|
+
specification_version: 4
|
43
|
+
summary: Akamai Authorization Token for Ruby
|
44
|
+
test_files: []
|