Skip to content

Commit e7a7369

Browse files
authored
Merge pull request #6 from Authress/validate-service-client-keys
Enable service client keys to be validated.
2 parents 322e050 + b10b46d commit e7a7369

5 files changed

+31
-27
lines changed

Gemfile.lock

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ PATH
66
jwt (>= 2.8)
77
oauth2
88
omniauth-oauth2
9+
openssl
910
rbnacl
1011
typhoeus (>= 1.4)
1112

@@ -44,6 +45,7 @@ GEM
4445
omniauth-oauth2 (1.8.0)
4546
oauth2 (>= 1.4, < 3)
4647
omniauth (~> 2.0)
48+
openssl (3.2.0)
4749
parallel (1.22.1)
4850
parser (3.2.1.1)
4951
ast (~> 2.4.1)

authress-sdk.gemspec

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ Gem::Specification.new do |s|
4747
s.add_runtime_dependency 'jwt', '>= 2.8'
4848
s.add_runtime_dependency 'oauth2'
4949
s.add_runtime_dependency 'rbnacl'
50+
s.add_runtime_dependency 'openssl'
5051

5152
s.add_development_dependency 'rspec'
5253

lib/authress-sdk/service_client_token_provider.rb

+11-6
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,19 @@ def get_token()
6262
raise Exception("Invalid Service Client Access Key")
6363
end
6464

65-
return decodedAccessKey.privateKey
65+
priv_pem = <<~EOF
66+
-----BEGIN PRIVATE KEY-----
67+
#{decodedAccessKey.privateKey}
68+
-----END PRIVATE KEY-----
69+
EOF
6670

67-
# The Ed25519 module is broken right now and doesn't accept valid private keys.
68-
# private_key = RbNaCl::Signatures::Ed25519::SigningKey.new(Base64.decode64(decodedAccessKey.privateKey)[0, 32])
71+
privateKey = OpenSSL::PKey.read(priv_pem)
72+
result = Base64.encode64(privateKey.raw_private_key).tr('+/', '-_').delete('=')
73+
private_key = RbNaCl::Signatures::Ed25519::SigningKey.new(Base64.decode64(result))
6974

70-
# token = JWT.encode(jwt, private_key, 'ED25519', { typ: 'at+jwt', alg: 'EdDSA', kid: decodedAccessKey.keyId })
71-
# @cachedKeyData = { token: token, expires: jwt['exp'] }
72-
# return token
75+
token = JWT.encode(jwt, private_key, 'ED25519', { typ: 'at+jwt', alg: 'EdDSA', kid: decodedAccessKey.keyId })
76+
@cachedKeyData = { token: token, expires: jwt['exp'] }
77+
return token
7378
end
7479
end
7580
end
+6-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
=begin
2-
3-
=end
4-
51
require 'spec_helper'
62

73
customDomain = 'authress.token-validation.test'
@@ -15,14 +11,14 @@
1511
tokenProvider = AuthressSdk::ServiceClientTokenProvider.new(access_key, customDomain)
1612
result = tokenProvider.get_token()
1713

18-
# user_identity = JSON.parse(Base64.decode64(result.split(".")[1].tr('-_','+/')))
14+
user_identity = JSON.parse(Base64.decode64(result.split(".")[1].tr('-_','+/')))
1915

20-
# expect(user_identity["client_id"]).to eq("CLIENT");
21-
# expect(user_identity["sub"]).to eq("CLIENT");
22-
# expect(user_identity["iss"]).to eq("https://authress.token-validation.test/v1/clients/CLIENT");
16+
expect(user_identity["client_id"]).to eq("CLIENT");
17+
expect(user_identity["sub"]).to eq("CLIENT");
18+
expect(user_identity["iss"]).to eq("https://authress.token-validation.test/v1/clients/CLIENT");
2319

24-
# headers = JSON.parse(Base64.decode64(result.split(".")[0].tr('-_','+/')))
25-
# expect(headers).to eq({"alg"=>"EdDSA", "kid"=>"KEY", "typ"=>"at+jwt"})
20+
headers = JSON.parse(Base64.decode64(result.split(".")[0].tr('-_','+/')))
21+
expect(headers).to eq({"alg"=>"EdDSA", "kid"=>"KEY", "typ"=>"at+jwt"})
2622
end
2723
end
2824
end

spec/token_validator_spec.rb

+11-11
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@
55

66
describe AuthressSdk::TokenVerifier do
77
describe "verify_token()" do
8-
# it "Verifies a service client access key used token" do
9-
# access_key = "CLIENT.KEY.ACCOUNT.MC4CAQAwBQYDK2VwBCIEIDVjjrIVCH3dVRq4ixRzBwjVHSoB2QzZ2iJuHq1Wshwp"
10-
# publicKey = { "alg": "EdDSA", "kty": "OKP", "crv": "Ed25519", "x": "JxtSC5tZZJuaW7Aeu5Kh_3tgCpPZRkHaaFyTj5sQ3KU" }
8+
it "Verifies a service client access key used token" do
9+
access_key = "CLIENT.KEY.ACCOUNT.MC4CAQAwBQYDK2VwBCIEIDVjjrIVCH3dVRq4ixRzBwjVHSoB2QzZ2iJuHq1Wshwp"
10+
publicKey = { "alg": "EdDSA", "kty": "OKP", "crv": "Ed25519", "x": "JxtSC5tZZJuaW7Aeu5Kh_3tgCpPZRkHaaFyTj5sQ3KU" }
1111

12-
# token_verifier_instance = AuthressSdk::TokenVerifier.new()
12+
token_verifier_instance = AuthressSdk::TokenVerifier.new()
1313

14-
# allow(token_verifier_instance).to receive(:get_key_uncached) { jwks = JWT::JWK.new(publicKey) }
14+
allow(token_verifier_instance).to receive(:get_key_uncached) { jwks = JWT::JWK.new(publicKey) }
1515

16-
# identity = token_verifier_instance.verify_token("https://#{customDomain}", access_key)
16+
identity = token_verifier_instance.verify_token("https://#{customDomain}", access_key)
1717

18-
# expect(token_verifier_instance).to have_received(:get_key_uncached).with("https://#{customDomain}/v1/clients/CLIENT/.well-known/openid-configuration/jwks", "KEY")
19-
# expect(identity["iss"]).to eq("https://#{customDomain}/v1/clients/CLIENT")
20-
# expect(identity["sub"]).to eq("CLIENT")
21-
# expect(identity["client_id"]).to eq("CLIENT")
22-
# end
18+
expect(token_verifier_instance).to have_received(:get_key_uncached).with("https://#{customDomain}/v1/clients/CLIENT/.well-known/openid-configuration/jwks", "KEY")
19+
expect(identity["iss"]).to eq("https://#{customDomain}/v1/clients/CLIENT")
20+
expect(identity["sub"]).to eq("CLIENT")
21+
expect(identity["client_id"]).to eq("CLIENT")
22+
end
2323

2424
it "Verifies a valid token" do
2525
access_key = "eyJhbGciOiJFZERTQSIsImtpZCI6IktFWSIsInR5cCI6ImF0K2p3dCJ9.eyJhdWQiOiJBQ0NPVU5ULmFjY291bnRzLmF1dGhyZXNzLmlvIiwiaXNzIjoiaHR0cHM6Ly9hdXRocmVzcy50b2tlbi12YWxpZGF0aW9uLnRlc3QvdjEvY2xpZW50cy9DTElFTlQiLCJzdWIiOiJDTElFTlQiLCJjbGllbnRfaWQiOiJDTElFTlQiLCJpYXQiOjE3MTQ1ODA4NDQsImV4cCI6MTcxNDY2NzI0NCwic2NvcGUiOiJvcGVuaWQifQ.Rm8VvEO9dKn9RTEVkF_qH7NernVKnKwYu9GAnxUBjiweXubWchIAW8HymD-RAdXjzPYU9Pvq5p0f_1Pi4n2bBw"

0 commit comments

Comments
 (0)