import { WebApiConfiguration } from './web-api-configuration'; import { AccessTokenProvider, AccessToken } from './access-token-provider'; /** * @export * @class OauthProvider * @implements {OathInterface} */ export class OauthProvider implements OathInterface { accessTokenProvider: AccessTokenProvider; config: WebApiConfiguration; /** * Creates an instance of OauthProvider. * @param {AccessTokenProvider} accessTokenProvider * @param {WebApiConfiguration} config * * @memberOf OauthProvider */ constructor(accessTokenProvider: AccessTokenProvider, config: WebApiConfiguration) { this.accessTokenProvider = accessTokenProvider; this.config = config; } /** * Returns url for authentication based on provided config * @returns {string} * * @memberOf OauthProvider */ getOauth2Url(): string { if (this.config.oauth2.clientSecret) { return `${this.config.environment.oAuth2ContextBaseUrl}/auth?response_type=code&client_id=${this.config.oauth2.clientId}&access_type=offline&redirect_uri=${this.config.oauth2.redirectUri}`; } return `${this.config.environment.oAuth2ContextBaseUrl}/auth?response_type=token&client_id=${this.config.oauth2.clientId}&redirect_uri=${this.config.oauth2.redirectUri}` } /** * Parses callback uri and extracts information that is used for requesting access token * * @param {string} url * @returns {Promise} * * @memberOf OauthProvider */ processRedirect(url: string): Promise { if (this.config.oauth2.clientSecret) { try { var code: string = /code=([^&]*)/.exec(url)[1]; } catch (e) { throw new Error('Passed url does not contain code.'); } this.accessTokenProvider.useCode(code); return this.accessTokenProvider.getAccessToken(); } try { var expiration: any = /expires_in=([^&]*)/.exec(url)[1]; var accessToken = { token: /access_token=([^&]*)/.exec(url)[1], tokenType: /token_type=([^&]*)/.exec(url)[1], expiresIn: Date.now() + (expiration * 1000) - 5000, } } catch (e) { throw new Error('Passed url does not contain access token, token type or expiration.'); } this.accessTokenProvider.useAccessToken(accessToken); return this.accessTokenProvider.getAccessToken(); } } /** * @export * @interface OathInterface */ export interface OathInterface { getOauth2Url(): string; processRedirect(url: string): any; }