ons-jwe 1.0.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/README.md +54 -0
- data/lib/ons-jwe.rb +2 -0
- data/lib/ons-jwe/jwe_token.rb +64 -0
- data/lib/ons-jwe/version.rb +9 -0
- metadata +150 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a8bc97876dcae5fcff526459efb0de2502bca222
|
4
|
+
data.tar.gz: e92c84cc1917b6715360e167d730bd32a0b7b98e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 68c2c8a3cdc027a7b5683c6e2323487d43a7b286f8864463fde8d7cc614b15329398f7cf31f5a8acb4c61fa780f8b6938f23e8d3281b2e0b312adfaf19a744be
|
7
|
+
data.tar.gz: 76d3c78839a51f6758bed653f9e0934d1bfef3a5c4fa3a895b92bf704886a2feb40805e6e6fbbb8846b3c4e18a95a3dad5f22917c25171238cb3d6cb74ed85f5
|
data/README.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# ONS JSON Web Token RubyGem
|
2
|
+
[RFC 7516](https://tools.ietf.org/html/rfc7516)-compliant JSON Web Encryption (JWE) token generator that uses RSAES-OAEP and AES GCM. Suitable for use with the [ONS eQ Survey Runner](https://github.com/ONSdigital/eq-survey-runner). Note that this gem targets Ruby 2.3 and above.
|
3
|
+
|
4
|
+
[](https://travis-ci.org/ONSdigital/jwe-rubygem)
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
```
|
9
|
+
gem install ons-jwe
|
10
|
+
```
|
11
|
+
|
12
|
+
## Examples
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
require 'openssl'
|
16
|
+
require 'ons-jwe'
|
17
|
+
|
18
|
+
KEY_ID = 'EDCRRM'
|
19
|
+
|
20
|
+
RESPONDENT_PORTAL_PRIVATE_KEY = File.read('sdc-user-authentication-signing-rrm-private-key.pem')
|
21
|
+
SURVEY_RUNNER_PUBLIC_KEY = File.read('sdc-user-authentication-encryption-sr-public-key.pem')
|
22
|
+
|
23
|
+
public_key = OpenSSL::PKey::RSA.new(SURVEY_RUNNER_PUBLIC_KEY)
|
24
|
+
private_key = OpenSSL::PKey::RSA.new(RESPONDENT_PORTAL_PRIVATE_KEY, 'digitaleq')
|
25
|
+
|
26
|
+
claims = {
|
27
|
+
user_id: 'John Topley',
|
28
|
+
iat: Time.now.to_i,
|
29
|
+
exp: Time.now.to_i + 60 * 60,
|
30
|
+
eq_id: '1',
|
31
|
+
period_str: '2016-01-01',
|
32
|
+
period_id: '2016-01-01',
|
33
|
+
form_type: '0205',
|
34
|
+
collection_exercise_sid: '789',
|
35
|
+
ref_p_start_date: '2016-01-01',
|
36
|
+
ref_p_end_date: '2016-09-01',
|
37
|
+
ru_ref: '12346789012A',
|
38
|
+
ru_name: 'Office for National Statistics',
|
39
|
+
return_by: '2016-04-30',
|
40
|
+
employment_date: '2016-06-10'
|
41
|
+
}
|
42
|
+
|
43
|
+
token = JWEToken.new(KEY_ID, claims, public_key, private_key)
|
44
|
+
puts token.value
|
45
|
+
```
|
46
|
+
|
47
|
+
## Testing
|
48
|
+
|
49
|
+
```
|
50
|
+
rake test
|
51
|
+
```
|
52
|
+
|
53
|
+
## Copyright
|
54
|
+
Copyright (C) 2016 Crown Copyright (Office for National Statistics)
|
data/lib/ons-jwe.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'json/jwt'
|
3
|
+
|
4
|
+
# This class generates JSON Web Encryption (JWE) tokens as per RFC 7516.
|
5
|
+
class JWEToken
|
6
|
+
attr_reader :value
|
7
|
+
|
8
|
+
def initialize(key_id, claims, public_key, private_key)
|
9
|
+
validate_key_id(key_id)
|
10
|
+
validate_claims(claims)
|
11
|
+
validate_public_key(public_key)
|
12
|
+
validate_private_key(private_key)
|
13
|
+
jwt = build_jwt(claims, key_id)
|
14
|
+
jws = build_jws(jwt, private_key)
|
15
|
+
@value = build_jwe(jws, public_key).to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
@value
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def build_jwe(jws, public_key)
|
25
|
+
jws.encrypt(public_key, :'RSA-OAEP', :A256GCM)
|
26
|
+
end
|
27
|
+
|
28
|
+
def build_jwt(claims, key_id)
|
29
|
+
jwt = JSON::JWT.new(claims)
|
30
|
+
jwt.kid = key_id
|
31
|
+
jwt.alg = :RS256
|
32
|
+
jwt
|
33
|
+
end
|
34
|
+
|
35
|
+
def build_jws(jwt, private_key)
|
36
|
+
jwt.sign(private_key, :RS256)
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate_claims(claims)
|
40
|
+
raise ArgumentError, 'claims must be specified' if claims.nil? ||
|
41
|
+
claims.empty?
|
42
|
+
end
|
43
|
+
|
44
|
+
def validate_key_id(key_id)
|
45
|
+
raise ArgumentError, 'key_id must be specified' if key_id.nil? ||
|
46
|
+
key_id.empty?
|
47
|
+
end
|
48
|
+
|
49
|
+
def validate_private_key(private_key)
|
50
|
+
raise ArgumentError, 'private_key must be specified' if private_key.nil?
|
51
|
+
validate_rsa_key(private_key, 'private_key')
|
52
|
+
end
|
53
|
+
|
54
|
+
def validate_public_key(public_key)
|
55
|
+
raise ArgumentError, 'public_key must be specified' if public_key.nil?
|
56
|
+
validate_rsa_key(public_key, 'public_key')
|
57
|
+
end
|
58
|
+
|
59
|
+
def validate_rsa_key(key, key_type)
|
60
|
+
unless key.instance_of? OpenSSL::PKey::RSA
|
61
|
+
raise ArgumentError, "#{key_type} must be an RSA key"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
metadata
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ons-jwe
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John Topley
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json-jwt
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.6.3
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.6.3
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: bundler
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.12.5
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.12.5
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rake
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '11'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 11.1.2
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '11'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 11.1.2
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: rubocop
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.42.0
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 0.42.0
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: test-unit
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '3'
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 3.1.9
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '3'
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 3.1.9
|
113
|
+
description: |
|
114
|
+
RFC7516-compliant JSON Web Encryption (JWE) token generator that uses RSAES-OAEP and AES GCM.
|
115
|
+
Suitable for use with the ONS eQ Survey Runner.
|
116
|
+
email:
|
117
|
+
- john.topley@ons.gov.uk
|
118
|
+
executables: []
|
119
|
+
extensions: []
|
120
|
+
extra_rdoc_files: []
|
121
|
+
files:
|
122
|
+
- README.md
|
123
|
+
- lib/ons-jwe.rb
|
124
|
+
- lib/ons-jwe/jwe_token.rb
|
125
|
+
- lib/ons-jwe/version.rb
|
126
|
+
homepage: https://github.com/ONSdigital/jwe-rubygem
|
127
|
+
licenses:
|
128
|
+
- Crown Copyright (Office for National Statistics)
|
129
|
+
metadata: {}
|
130
|
+
post_install_message:
|
131
|
+
rdoc_options: []
|
132
|
+
require_paths:
|
133
|
+
- lib
|
134
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
requirements: []
|
145
|
+
rubyforge_project:
|
146
|
+
rubygems_version: 2.6.6
|
147
|
+
signing_key:
|
148
|
+
specification_version: 4
|
149
|
+
summary: JSON Web Encryption (JWE) token generator
|
150
|
+
test_files: []
|