summaryrefslogtreecommitdiff
path: root/lib/json_web_token/rsa_token.rb
diff options
context:
space:
mode:
authorKamil Trzcinski <ayufan@ayufan.eu>2016-05-14 18:23:31 -0500
committerKamil Trzcinski <ayufan@ayufan.eu>2016-05-14 18:23:31 -0500
commitf4f9184a01bc7442411bbcffd9b6a86784fa5f53 (patch)
tree0d841ce4a6ccedc06035d90d32a31c017d443d2b /lib/json_web_token/rsa_token.rb
parentdf973df8c536fb9ffe0a9ed4e92f7d9144eb687a (diff)
downloadgitlab-ce-f4f9184a01bc7442411bbcffd9b6a86784fa5f53.tar.gz
Rename JWT to JSONWebToken
Diffstat (limited to 'lib/json_web_token/rsa_token.rb')
-rw-r--r--lib/json_web_token/rsa_token.rb42
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/json_web_token/rsa_token.rb b/lib/json_web_token/rsa_token.rb
new file mode 100644
index 00000000000..d6d6af7089c
--- /dev/null
+++ b/lib/json_web_token/rsa_token.rb
@@ -0,0 +1,42 @@
+module JSONWebToken
+ class RSAToken < Token
+ attr_reader :key_file
+
+ def initialize(key_file)
+ super()
+ @key_file = key_file
+ end
+
+ def encoded
+ headers = {
+ kid: kid
+ }
+ JWT.encode(payload, key, 'RS256', headers)
+ end
+
+ private
+
+ def key_data
+ @key_data ||= File.read(key_file)
+ end
+
+ def key
+ @key ||= OpenSSL::PKey::RSA.new(key_data)
+ end
+
+ def public_key
+ key.public_key
+ end
+
+ def kid
+ # calculate sha256 from DER encoded ASN1
+ kid = Digest::SHA256.digest(public_key.to_der)
+
+ # we encode only 30 bytes with base32
+ kid = Base32.encode(kid[0..29])
+
+ # insert colon every 4 characters
+ kid.scan(/.{4}/).join(':')
+ end
+ end
+end