Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"build": "npx rollup -c --exports default",
"prepublish": "npm run build",
"lint": "eslint . --ext .js",
"lint:fix": "eslint . --ext .js --fix",
"test": "cross-env NODE_ENV=test nyc --reporter=lcov --reporter=text mocha"
},
"publishConfig": {
Expand Down
22 changes: 18 additions & 4 deletions src/accessToken.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import { OAuth2 } from 'oauth';
import pino from 'pino';

const tokenStore = {};
const ACCESS_TOKEN_PATH = '/oauth2/token';
const EXPIRY_MARGIN = 1000 * 60 * 5; // 5 minute margin

const logger = pino({
name: '@digipolis/auth-accesstoken',
level: 'error',
});

function createUserToken(results, refreshToken) {
return {
accessToken: results.access_token,
Expand All @@ -18,6 +24,7 @@ function getNewAccessToken(clientId, clientSecret, url) {
return new Promise((resolve, reject) => {
oauth2.getOAuthAccessToken('', { grant_type: 'client_credentials' }, (err, accessToken, _refreshToken, results) => {
if (err) {
logger.error('An error occurred while getting new access token with client credentials', err);
return reject(err);
}

Expand All @@ -38,6 +45,7 @@ export function getUserTokenFromAuthorizationCode(code, clientId, clientSecret,
{ grant_type: 'authorization_code' },
(err, _accessToken, refreshToken, results) => {
if (err) {
logger.error('An error occurred while getting new access token with authorization code', err);
return reject(err);
}

Expand All @@ -56,6 +64,7 @@ export function refreshAccessToken(token, clientId, clientSecret, url) {
{ grant_type: 'refresh_token' },
(err, _accessToken, refreshToken, results) => {
if (err) {
logger.error('An error occurred while getting new access token with refresh token', err);
return reject(err);
}

Expand All @@ -67,10 +76,15 @@ export function refreshAccessToken(token, clientId, clientSecret, url) {
}

export async function getAccessToken(clientId, clientSecret, url) {
if (tokenStore.token && tokenStore.token.expiresIn > Date.now()) {
try {
if (tokenStore.token && tokenStore.token.expiresIn > Date.now()) {
return tokenStore.token.accessToken;
}

tokenStore.token = await getNewAccessToken(clientId, clientSecret, url);
return tokenStore.token.accessToken;
} catch (error) {
logger.error('An error occurred while getting new access token', error);
return null;
}

tokenStore.token = await getNewAccessToken(clientId, clientSecret, url);
return tokenStore.token.accessToken;
}
31 changes: 18 additions & 13 deletions src/controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -288,23 +288,28 @@ export default function createController(config) {
}

async function refreshToken(req, res, next) {
if (!refresh) {
return next();
}
try {
if (!refresh) {
return next();
}

const tokenKey = `${objectKey}Token`;
const token = req.session[tokenKey];
if (!token) {
return next();
}
const tokenKey = `${objectKey}Token`;
const token = req.session[tokenKey];
if (!token) {
return next();
}

if (new Date(token.expiresIn) >= new Date(Date.now() + EXPIRY_MARGIN)) {
if (new Date(token.expiresIn) >= new Date(Date.now() + EXPIRY_MARGIN)) {
return next();
}

const newToken = await service.refresh(token);
req.session = Object.assign(req.session, { [tokenKey]: newToken });
return req.session.save(() => next());
} catch (error) {
logger.error('An error occurred while refreshing token', error);
return next();
}

const newToken = await service.refresh(token);
req.session = Object.assign(req.session, { [tokenKey]: newToken });
return req.session.save(() => next());
}

return {
Expand Down