import axios from 'axios'
import debug from 'debug'
import { typeValidation } from '../utils/validator'
const ACCESS_TOKEN_GRANT_TYPE = 'authorization_code'
const REFRESH_TOKEN_GRANT_TYPE = 'refresh_token'
const log = debug('starling:oauth-service')
/**
* Service to interact with a the oauth endpoint
*/
class OAuth {
/**
* Create a new oauth service
* @param {Object} options - configuration parameters
*/
constructor (options) {
this.options = options
}
/**
* Exchanges the authorization code for an access token
* @param {string} authorizationCode - the authorization code, acquired from the user agent after the
* user authenticates with starling
* @return {Promise} - the http request promise
*/
getAccessToken (authorizationCode) {
typeValidation(arguments, authorizationCodeParameterDefinition)
return this.getOAuthToken({
code: authorizationCode,
grant_type: ACCESS_TOKEN_GRANT_TYPE,
client_id: this.options.clientId,
client_secret: this.options.clientSecret,
redirect_uri: this.options.redirectUri
})
}
/**
* Exchanges the authorization code for an access token
* @param {string} refreshToken - the oauth refresh token, used when the access token
* expires to claim a new access token.
* @return {Promise} - the http request promise
*/
refreshAccessToken (refreshToken) {
typeValidation(arguments, refreshTokenParameterDefinition)
return this.getOAuthToken({
refresh_token: refreshToken,
grant_type: REFRESH_TOKEN_GRANT_TYPE,
client_id: this.options.clientId,
client_secret: this.options.clientSecret
})
}
/**
* Gets the access token from the starling oauth endpoint
* @param {object} params - the query params passed to the oauth endpoint as per the oauth spec
* @return {Promise} - the http request promise
*/
getOAuthToken (params) {
if (!this.options.clientId) {
throw Error('clientId is not configured')
}
if (!this.options.clientSecret) {
throw Error('clientSecret is not configured')
}
const url = `${this.options.oauthUrl}/oauth/access-token`
log(`POST ${url} queryParams:${JSON.stringify(params)}`)
return axios({
url,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Accept: 'application/json'
},
params: params
})
}
}
const refreshTokenParameterDefinition = [
{ name: 'refreshToken', validations: ['required', 'string'] }
]
const authorizationCodeParameterDefinition = [
{ name: 'authorizationCode', validations: ['required', 'string'] }
]
module.exports = OAuth