Skip to content

Commit 4e1f364

Browse files
authored
Fix loading JWT when auth subject has no permissions (nightscout#7894)
* Fix an issue reported by Milos, when a JWT is loaded with a subject that has no permissions * Add unit test to cover this case
1 parent 0f69153 commit 4e1f364

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

lib/authorization/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ function init (env, ctx) {
298298
const token = env.enclave.signJWT({ accessToken: subject.accessToken });
299299
const decoded = env.enclave.verifyJWT(token);
300300

301-
var roles = _.uniq(subject.roles.concat(defaultRoles));
301+
var roles = subject.roles ? _.uniq(subject.roles.concat(defaultRoles)) : defaultRoles;
302302

303303
authorized = {
304304
token

tests/api.security.test.js

+14
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,20 @@ describe('Security of REST API V1', function() {
7171
});
7272
});
7373

74+
it('Should return a JWT with default roles on broken role token', function(done) {
75+
const now = Math.round(Date.now() / 1000) - 1;
76+
request(self.app)
77+
.get('/api/v2/authorization/request/' + self.token.noneSubject)
78+
.expect(200)
79+
.end(function(err, res) {
80+
const decodedToken = jwt.decode(res.body.token);
81+
decodedToken.accessToken.should.equal(self.token.noneSubject);
82+
decodedToken.iat.should.be.aboveOrEqual(now);
83+
decodedToken.exp.should.be.above(decodedToken.iat);
84+
done();
85+
});
86+
});
87+
7488
it('Data load should succeed with API SECRET', function(done) {
7589
request(self.app)
7690
.get('/api/v1/entries.json')

tests/fixtures/api3/authSubject.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ async function authSubject (authStorage) {
6767
await createRole(authStorage, 'apiRead', 'api:*:read');
6868
await createRole(authStorage, 'apiUpdate', 'api:*:update');
6969
await createRole(authStorage, 'apiDelete', 'api:*:delete');
70+
await createRole(authStorage, 'noneRole', '');
7071

7172
const subject = {
7273
apiAll: await createTestSubject(authStorage, 'apiAll', ['apiAll']),
@@ -77,7 +78,9 @@ async function authSubject (authStorage) {
7778
apiDelete: await createTestSubject(authStorage, 'apiDelete', ['apiDelete']),
7879
admin: await createTestSubject(authStorage, 'admin', ['admin']),
7980
readable: await createTestSubject(authStorage, 'readable', ['readable']),
80-
denied: await createTestSubject(authStorage, 'denied', ['denied'])
81+
denied: await createTestSubject(authStorage, 'denied', ['denied']),
82+
noneSubject: await createTestSubject(authStorage, 'noneSubject', null),
83+
noneRole: await createTestSubject(authStorage, 'noneRole', ['noneRole'])
8184
};
8285

8386
const token = {
@@ -89,7 +92,9 @@ async function authSubject (authStorage) {
8992
delete: subject.apiDelete.accessToken,
9093
denied: subject.denied.accessToken,
9194
adminAll: subject.admin.accessToken,
92-
readable: subject.readable.accessToken
95+
readable: subject.readable.accessToken,
96+
noneSubject: subject.noneSubject.accessToken,
97+
noneRole: subject.noneRole.accessToken
9398
};
9499

95100
return {subject, token};

0 commit comments

Comments
 (0)