Skip to content

Commit 7b9e66b

Browse files
authored
Add entitlements to session (#349)
* Refactor session spec to mock less and split out the payload Allowing more complete testing of the token with only the verification being mocked. The separate payload enables creating more tests with differing payloads. * Include entitlements in the authenticated session If the users organisation has a stripe link the token includes any entitlements, this should be exposed to client code. Fixes #336
1 parent 2a1b2a5 commit 7b9e66b

File tree

2 files changed

+47
-18
lines changed

2 files changed

+47
-18
lines changed

lib/workos/session.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def authenticate
5050
organization_id: decoded['org_id'],
5151
role: decoded['role'],
5252
permissions: decoded['permissions'],
53+
entitlements: decoded['entitlements'],
5354
user: session[:user],
5455
impersonator: session[:impersonator],
5556
reason: nil,

spec/lib/workos/session_spec.rb

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -103,24 +103,23 @@
103103

104104
describe '.authenticate' do
105105
let(:user_management) { instance_double('UserManagement') }
106-
let(:valid_access_token) do
107-
payload = {
106+
let(:payload) do
107+
{
108108
sid: 'session_id',
109109
org_id: 'org_id',
110110
role: 'role',
111111
permissions: ['read'],
112112
exp: Time.now.to_i + 3600,
113113
}
114-
headers = { kid: jwk[:kid] }
115-
JWT.encode(payload, jwk.signing_key, jwk[:alg], headers)
116114
end
115+
let(:valid_access_token) { JWT.encode(payload, jwk.signing_key, jwk[:alg], { kid: jwk[:kid] }) }
117116
let(:session_data) do
118-
WorkOS::Session.seal_data({
119-
access_token: valid_access_token,
120-
user: 'user',
121-
impersonator: 'impersonator',
122-
}, cookie_password,)
123-
end
117+
WorkOS::Session.seal_data({
118+
access_token: valid_access_token,
119+
user: 'user',
120+
impersonator: 'impersonator',
121+
}, cookie_password,)
122+
end
124123

125124
before do
126125
allow(user_management).to receive(:get_jwks_url).with(client_id).and_return(jwks_url)
@@ -167,26 +166,55 @@
167166
session_data: session_data,
168167
cookie_password: cookie_password,
169168
)
170-
allow(session).to receive(:is_valid_jwt).and_return(true)
171-
allow(JWT).to receive(:decode).and_return([{
172-
'sid' => 'session_id',
173-
'org_id' => 'org_id',
174-
'role' => 'role',
175-
'permissions' => ['read'],
176-
}])
177-
169+
allow_any_instance_of(JWT::Decode).to receive(:verify_signature).and_return(true)
178170
result = session.authenticate
179171
expect(result).to eq({
180172
authenticated: true,
181173
session_id: 'session_id',
182174
organization_id: 'org_id',
183175
role: 'role',
184176
permissions: ['read'],
177+
entitlements: nil,
185178
user: 'user',
186179
impersonator: 'impersonator',
187180
reason: nil,
188181
})
189182
end
183+
184+
describe 'with entitlements' do
185+
let(:payload) do
186+
{
187+
sid: 'session_id',
188+
org_id: 'org_id',
189+
role: 'role',
190+
permissions: ['read'],
191+
entitlements: ['billing'],
192+
exp: Time.now.to_i + 3600,
193+
}
194+
end
195+
196+
it 'includes entitlements in the result' do
197+
session = WorkOS::Session.new(
198+
user_management: user_management,
199+
client_id: client_id,
200+
session_data: session_data,
201+
cookie_password: cookie_password,
202+
)
203+
allow_any_instance_of(JWT::Decode).to receive(:verify_signature).and_return(true)
204+
result = session.authenticate
205+
expect(result).to eq({
206+
authenticated: true,
207+
session_id: 'session_id',
208+
organization_id: 'org_id',
209+
role: 'role',
210+
permissions: ['read'],
211+
entitlements: ['billing'],
212+
user: 'user',
213+
impersonator: 'impersonator',
214+
reason: nil,
215+
})
216+
end
217+
end
190218
end
191219

192220
describe '.refresh' do

0 commit comments

Comments
 (0)