Skip to content

Commit

Permalink
Merge pull request strongloop#1496 from strongloop/fix/logout-without…
Browse files Browse the repository at this point in the history
…-token

Fail with "401 Unauthorized" when token is not provided to User.logout()
  • Loading branch information
bajtos authored Jan 30, 2017
2 parents 82d6ede + d45c1ae commit 1d02e04
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 6 deletions.
22 changes: 16 additions & 6 deletions common/models/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -292,13 +292,23 @@ module.exports = function(User) {

User.logout = function(tokenId, fn) {
fn = fn || utils.createPromiseCallback();
this.relations.accessTokens.modelTo.findById(tokenId, function(err, accessToken) {

if (!tokenId) {
var err = new Error(g.f('{{accessToken}} is required to logout'));
err.status = 401;
process.nextTick(fn, err);
return fn.promise;
}

this.relations.accessTokens.modelTo.destroyById(tokenId, function(err, info) {
if (err) {
fn(err);
} else if (accessToken) {
accessToken.destroy(fn);
} else if ('count' in info && info.count === 0) {
var err = new Error(g.f('Could not find {{accessToken}}'));
err.status = 401;
fn(err);
} else {
fn(new Error(g.f('could not find {{accessToken}}')));
fn();
}
});
return fn.promise;
Expand Down Expand Up @@ -753,10 +763,10 @@ module.exports = function(User) {
{
description: 'Logout a user with access token.',
accepts: [
{arg: 'access_token', type: 'string', required: true, http: function(ctx) {
{arg: 'access_token', type: 'string', http: function(ctx) {
var req = ctx && ctx.req;
var accessToken = req && req.accessToken;
var tokenID = accessToken && accessToken.id;
var tokenID = accessToken ? accessToken.id : undefined;

return tokenID;
}, description: 'Do not supply this argument, it is automatically extracted ' +
Expand Down
11 changes: 11 additions & 0 deletions test/user.integration.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,17 @@ describe('users - integration', function() {
.expect(200, done);
});
});

it('returns 401 on logout with no access token', function(done) {
this.post('/api/users/logout')
.expect(401, done);
});

it('returns 401 on logout with invalid access token', function(done) {
this.post('/api/users/logout')
.set('Authorization', 'unknown-token')
.expect(401, done);
});
});

describe('sub-user', function() {
Expand Down
16 changes: 16 additions & 0 deletions test/user.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1193,6 +1193,22 @@ describe('User', function() {
}
});

it('fails when accessToken is not provided', function(done) {
User.logout(undefined, function(err) {
expect(err).to.have.property('message');
expect(err).to.have.property('status', 401);
done();
});
});

it('fails when accessToken is not found', function(done) {
User.logout('expired-access-token', function(err) {
expect(err).to.have.property('message');
expect(err).to.have.property('status', 401);
done();
});
});

function verify(token, done) {
assert(token);

Expand Down

0 comments on commit 1d02e04

Please sign in to comment.