lib-oauth-tooling v2.4.1
lib-oauth-tooling
A simple typescript based library for supporting OAuth2 flows. Currently the following flows are supported:
- Authorization Code Flow
- Resource Owner Password Credentials Grant
- Refresh token Grant
- Express middlewares to simplify authentication/authorization
TokenCacheservice to manage access tokens in your application
See STUPS documentation and OAuth2 documentation for more information.
Migrating to 2.x.x
If you depend on the realm property you now have to pass the value via the queryParams parameters in OAuthConfig:
// will NOT work anymore:
getAccessToken({
// all the other config
// ...
realm: EMPLOYEES_REALM,
})
.then(token: Token => {
// ...
});
// instead use this:
getAccessToken({
// all the other config
// ...
queryParams: { realm: '/employees' }
})
.then(token: Token => {
// ...
});See the changelog for more information.
Usage
Note: node >= 6.0.0 required to consume this library.
Run npm install lib-oauth-tooling.
Import a member of this lib like so (of course ES5 syntax is working as well...):
import {
TokenCache,
handleOAuthRequestMiddleware,
requireScopesMiddleware,
...
} from 'lib-oauth-tooling';TokenCache(tokenConfig: { key: string: string[] }, oauthConfig: OAuthConfig)
Class to request and cache tokens on client-side.
const tokenCache = new TokenCache({
'service-foo': ['foo.read', 'foo.write'],
'service-bar': ['bar.read']
}, oAuthConfig);
tokenCache.get('service-foo')
.then((token: Token) => {
console.log(token.access_token);
});oauthConfig:
credentialsDirstringgrantTypestring (AUTHORIZATION_CODE_GRANT|PASSWORD_CREDENTIALS_GRANT)accessTokenEndpointstringtokenInfoEndpointstring - mandatory for TokenCachescopesstring[] optionalqueryParams{} optionalredirect_uristring optional (required withAUTHORIZATION_CODE_GRANT)codestring optional (required withAUTHORIZATION_CODE_GRANT)
handleOAuthRequestMiddleware(options: MiddlewareOptions)
Express middleware to extract and validate an access token. It attaches the scopes matched by the token to the request (request.scopes) for further usage.
If the token is not valid the request is rejected (with 401 Unauthorized).
app.use(handleOAuthRequestMiddleware({
publicEndpoints: ['/heartbeat', '/status'],
tokenInfoEndpoint: 'auth.example.com/tokeninfo'
});options:
publicEndpointsstring[]tokenInfoEndpointstring
requireScopesMiddleware(scopes: string[])
Specifies the scopes needed to access an endpoint. Assumes that there is an request.scopes property (as attached by handleOAuthRequestMiddleware) to match the required scopes against.
If the the requested scopes are not matched request is rejected (with 403 Forbidden).
app.get('/secured/route', requireScopesMiddleware(['scopeA', 'scopeB']), (request, response) => {
// do your work...
})getTokenInfo(tokenInfoEndpoint: string, accessToken: string): Promise
Makes a request to the tokenInfoEndpoint to validate the given accessToken.
getTokenInfo(tokenInfoEndpoint, accessToken)
.then((token: Token) => {
console.log(token.access_token);
})
.catch((err) => {
console.log(err);
});Type Token is defined like:
interface Token {
access_token: string;
expires_in?: number;
scope?: string[];
token_type?: string;
local_expiry?: number;
[key: string]: {};
}getAccessToken(options: OAuthConfig): Promise
Helper function to get an access token for the specified scopes.
getAccessToken(options)
.then((token: Token) => {
console.log(token.access_token);
})
.catch((err) => {
console.log(err);
});options:
credentialsDirstringgrantTypestring (AUTHORIZATION_CODE_GRANT|PASSWORD_CREDENTIALS_GRANT|REFRESH_TOKEN_GRANT)accessTokenEndpointstringscopesstring optionalqueryParams{} optionalredirect_uristring optional (required withAUTHORIZATION_CODE_GRANT)codestring optional (required withAUTHORIZATION_CODE_GRANT)refreshTokenstring optional (required with REFRESH_TOKEN_GRANT)
AUTHORIZATION_CODE_GRANT
String constant specifying the Authorization Code Grant type.
PASSWORD_CREDENTIALS_GRANT
String constant specifying the Resource Owner Password Credentials Grant type.
REFRESH_TOKEN_GRANT
String constant specifying the Refresh Token Grant type.
Mock tooling
If you want to test oAuth locally without being able to actually call real endpoints this library provides some tooling.
mockTokenInfoEndpoint(options: MockOptions)
Mocks a tokeninfo endpoint.
mockTokeninfoEndpoint({
url: 'http://some.oauth.endpoint/tokeninfo',
tokens: [{
access_token: 'someToken123',
scope: ['uid', 'something.read', 'something.write']
}],
times: 1
});options:
urlstring (url of thetokeninfoendpoint)tokensany optional (list of valid tokens)timesnumber optional (for how many times/calls the endpoint is mocked, default isNumber.MAX_SAFE_INTEGER)
mockAccessTokenEndpoint(options: MockOptions)
Mocks a access_token endpoint.
mockAccessTokenEndpoint({
url: 'http://some.oauth.endpoint/access_token',
times: 1
});options:
urlstring (url of theaccess_tokenendpoint)timesnumber optional (for how many times/calls the endpoint is mocked, default isNumber.MAX_SAFE_INTEGER)
cleanMock()
Cleans all nock mocks (not only from this lib, really ALL) and given tokens.
Helpful when having multiple tests in a test suite, you can call cleanMock() in the afterEach() callback for example.
cleanMock();Development
- clone this repo
npm install- to build:
tsc - to lint:
npm run tslint
Testing
npm test- runs all testsnpm run unit-test- runs unit testsnpm run integration-test- runs integration tests
Changelog
2.0.0 - BREAKING
The (zalando-specific) realm property was removed from OAuthConfig. Also, the corresponding constants (SERVICES_REALM and EMPLYEES_REALM) were removed. Instead, you can add the realm (and arbitrary other query parameters) via the queryParams property in OAuthConfig.
1.0.0 - BREAKING
The signature of requireScopesMiddleware is now incompatible with previous versions, precedenceFunction? is now part of precedenceOptions?.
License
MIT
8 years ago
8 years ago
8 years ago
8 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago