Skip to content

Commit

Permalink
feat(rxTokenInjector): Simple $http injectors for auth and api calls.
Browse files Browse the repository at this point in the history
  • Loading branch information
chriscantu committed Apr 25, 2014
1 parent 3ac7007 commit 46b9d3c
Show file tree
Hide file tree
Showing 10 changed files with 154 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/rxSession/rxSession.js
Expand Up @@ -25,6 +25,12 @@ angular.module('encore.ui.rxSession', ['encore.ui.rxLocalStorage'])
return LocalStorage.getObject(TOKEN_ID);
};

session.getTokenId = function () {
var token = session.getToken();
return (token && token.access && token.access.token) ?
token.access.token.id : undefined;
};

session.storeToken = function (token) {
LocalStorage.setObject(TOKEN_ID, token);
};
Expand Down
6 changes: 6 additions & 0 deletions src/rxSession/rxSession.spec.js
Expand Up @@ -43,6 +43,12 @@ describe('rxSession', function () {
expect(storage.getObject.called);
});

it('getTokenId: should return the token id from session storage', function () {
var tokenId = session.getTokenId();
expect(tokenId).to.eq('someid');
expect(storage.getObject.called);
});

it('logoff: should remove token from session', function () {
session.logoff('encoreToken');
expect(storage.removeItem.called).to.be.true;
Expand Down
3 changes: 3 additions & 0 deletions src/rxTokenInterceptor/README.md
@@ -0,0 +1,3 @@
[![unstable](http://badges.github.io/stability-badges/dist/unstable.svg)](http://github.com/badges/stability-badges)

Simple $http interceptor which adds auth token id to http requests.
8 changes: 8 additions & 0 deletions src/rxTokenInterceptor/docs/rxTokenInterceptor.html
@@ -0,0 +1,8 @@
<pre>
<code>
angular.module('encoreApp', ['encore.ui'])
.config(function ($httpProvider) {
$httpProvider.interceptors.push('TokenInterceptor');
});
</code>
</pre>
26 changes: 26 additions & 0 deletions src/rxTokenInterceptor/rxTokenInterceptor.js
@@ -0,0 +1,26 @@
angular.module('encore.ui.rxTokenInterceptor', ['encore.ui.rxSession'])
/**
*
* @ngdoc service
* @name encore.ui.rxTokenInjector:TokenInjector
* @description
* Simple injector which will intercept http request and inject the
* Rackspace Identity's token into every http request.
*
* @requires encore.ui.rxSession:Session
*
* @example
* <pre>
* angular.module('encoreApp', ['encore.ui'])
* .config(function ($httpProvider) {
* $httpProvider.interceptors.push('TokenInterceptor');
* });
* </pre>
*/
.factory('TokenInterceptor', function (Session) {
return {
request: function (config) {
config.headers['X-Auth-Token'] = Session.getTokenId();
}
};
});
28 changes: 28 additions & 0 deletions src/rxTokenInterceptor/rxTokenInterceptor.spec.js
@@ -0,0 +1,28 @@
/* jshint node: true */

describe('rxTokenInterceptor', function () {
var interceptor, session;

beforeEach(function () {
// load module
module('encore.ui.rxTokenInterceptor');
module('encore.ui.rxSession');

inject(function ($injector) {
interceptor = $injector.get('TokenInterceptor');
session = $injector.get('Session');
session.getTokenId = sinon.stub().returns('12345');
});
});

it('Interceptor should exist', function () {
expect(interceptor).to.exist;
});

it('Interceptor sets X-Auth-Token in headers', function () {
var config = { headers: {}};
interceptor.request(config);
expect(config.headers).not.be.empty;
expect(config.headers['X-Auth-Token']).to.eq('12345');
});
});
3 changes: 3 additions & 0 deletions src/rxUnauthorizedInterceptor/README.md
@@ -0,0 +1,3 @@
[![unstable](http://badges.github.io/stability-badges/dist/unstable.svg)](http://github.com/badges/stability-badges)

Simple $http interceptor which will redirect users back to login on 401.
@@ -0,0 +1,8 @@
<pre>
<code>
angular.module('encoreApp', ['encore.ui'])
.config(function ($httpProvider) {
$httpProvider.interceptors.push('UnauthorizedInterceptor');
});
</code>
</pre>
31 changes: 31 additions & 0 deletions src/rxUnauthorizedInterceptor/rxUnauthorizedInterceptor.js
@@ -0,0 +1,31 @@
angular.module('encore.ui.rxUnauthorizedInterceptor', [])
/**
*
* @ngdoc service
* @name encore.ui.rxUnauthorizedInterceptor:UnauthorizedInterceptor
* @description
* Simple injector which will intercept http responses. If a 401 is returned,
* the ui redirects to /login.
*
* @requires $q
* @requires @window
*
* @example
* <pre>
* angular.module('encoreApp', ['encore.ui'])
* .config(function ($httpProvider) {
* $httpProvider.interceptors.push('UnauthorizedInterceptor');
* });
* </pre>
*/
.factory('UnauthorizedInterceptor', function ($q, $window) {
return {
responseError: function (response) {
if (response.status === 401) {
$window.location = '/login';
}

return $q.reject(response);
}
};
});
35 changes: 35 additions & 0 deletions src/rxUnauthorizedInterceptor/rxUnauthorizedInterceptor.spec.js
@@ -0,0 +1,35 @@
/* jshint node: true */

describe('rxUnauthorizedInterceptor', function () {
var interceptor, mockWindow = {},
q = { reject: sinon.spy() };

beforeEach(function () {
module('encore.ui.rxUnauthorizedInterceptor',
function ($provide) {
$provide.value('$window', mockWindow);
$provide.value('$q', q);
});

inject(function ($injector) {
interceptor = $injector.get('UnauthorizedInterceptor');
});
});

it('Unauthorized Interceptor shoud exist', function () {
expect(interceptor).to.exist;
});

it('Interceptor handles error responses', function () {
var response = { status: 500 };
interceptor.responseError(response);

expect(mockWindow.location).to.not.eq('/login');
expect(q.reject.called).to.be.true;

response.status = 401;
interceptor.responseError(response);
expect(mockWindow.location).to.eq('/login');
expect(q.reject.called).to.be.true;
});
});

0 comments on commit 46b9d3c

Please sign in to comment.