UNPKG

@bitrix24/b24jssdk

Version:

Bitrix24 REST API JavaScript SDK

1 lines 15.3 kB
{"version":3,"file":"auth.mjs","sources":["../../../src/oauth/auth.ts"],"sourcesContent":["import type { AxiosInstance } from 'axios'\nimport type { AuthActions, AuthData, B24OAuthParams, B24OAuthSecret, CallbackRefreshAuth, CustomRefreshAuth, HandlerRefreshAuth, TypeDescriptionError, TypeDescriptionErrorV3 } from '../types/auth'\nimport type { TypeHttp } from '../types/http'\nimport axios, { AxiosError } from 'axios'\nimport { RefreshTokenError } from './refresh-token-error'\nimport { Type } from '../tools/type'\nimport { EnumAppStatus } from '../types/b24-helper'\nimport { ApiVersion } from '../types/b24'\n\n/**\n * OAuth Authorization Manager\n *\n * @link https://apidocs.bitrix24.com/settings/oauth/index.html\n * @link https://bitrix24.github.io/b24jssdk/docs/oauth/\n */\nexport class AuthOAuthManager implements AuthActions {\n #clientAxios: AxiosInstance\n #callbackRefreshAuth: null | CallbackRefreshAuth = null\n #customRefreshAuth: null | CustomRefreshAuth = null\n #authOptions: B24OAuthParams\n readonly #oAuthSecret: B24OAuthSecret\n #authExpires: number = 0\n #authExpiresIn: number = 0\n readonly #domain: string\n readonly #b24TargetRest: string\n readonly #b24Target: string\n readonly #b24TargetRestWithPath: Map<ApiVersion, string>\n readonly #oAuthTarget: string // 'https://oauth.bitrix.info'\n\n #isAdmin: null | boolean = null\n\n constructor(\n b24OAuthParams: B24OAuthParams,\n oAuthSecret: B24OAuthSecret\n ) {\n this.#authOptions = Object.assign({}, b24OAuthParams) as B24OAuthParams\n this.#oAuthSecret = Object.freeze(Object.assign({}, oAuthSecret)) as B24OAuthSecret\n\n this.#domain = this.#authOptions.domain\n .replaceAll('https://', '')\n .replaceAll('http://', '')\n .replace(/:(80|443)$/, '')\n\n this.#b24TargetRest = this.#authOptions.clientEndpoint\n this.#b24Target = this.#b24TargetRest.replace('/rest/', '')\n this.#oAuthTarget = this.#authOptions.serverEndpoint.replace('/rest/', '')\n this.#authExpires = this.#authOptions.expires * 1_000\n this.#authExpiresIn = this.#authOptions.expiresIn\n\n this.#clientAxios = axios.create({\n baseURL: this.#oAuthTarget,\n headers: {\n 'Content-Type': 'application/json'\n }\n })\n\n this.#b24TargetRestWithPath = new Map()\n this.#b24TargetRestWithPath.set(ApiVersion.v2, `${this.#b24TargetRest}`)\n this.#b24TargetRestWithPath.set(ApiVersion.v3, `${this.#b24TargetRest}/api`)\n }\n\n /**\n * Returns authorization data\n * @see Http.#prepareParams\n */\n public getAuthData(): false | AuthData {\n return this.#authExpires > Date.now()\n ? ({\n access_token: this.#authOptions.accessToken,\n refresh_token: this.#authOptions.refreshToken,\n expires: this.#authExpires / 1_000,\n expires_in: this.#authExpiresIn,\n domain: this.#domain,\n member_id: this.#authOptions.memberId\n } as AuthData)\n : false\n }\n\n // region RefreshAuth ////\n /**\n * Updates authorization data\n */\n public async refreshAuth(): Promise<AuthData> {\n try {\n let payload: undefined | HandlerRefreshAuth = undefined\n\n if (this.#customRefreshAuth) {\n payload = await this.#customRefreshAuth()\n } else {\n const response = await this.#clientAxios.get(\n '/oauth/token/',\n {\n params: {\n grant_type: 'refresh_token',\n client_id: this.#oAuthSecret.clientId,\n client_secret: this.#oAuthSecret.clientSecret,\n refresh_token: this.#authOptions.refreshToken\n }\n }\n )\n\n if (response.data.error) {\n throw new Error(`Token update error: ${response.data.error}`)\n }\n if (response.status !== 200) {\n throw new Error(`Token update error status code: ${response.status}`)\n }\n\n /**\n * @memo domain = 'oauth.bitrix.info'\n */\n payload = response.data\n }\n\n if (!payload) {\n throw new Error('Unable to obtain authorization update data')\n }\n\n this.#authOptions.accessToken = payload.access_token\n this.#authOptions.refreshToken = payload.refresh_token\n this.#authOptions.expires = Number.parseInt(payload.expires || '0')\n this.#authOptions.expiresIn = Number.parseInt(payload.expires_in || '3600')\n this.#authOptions.clientEndpoint = payload.client_endpoint\n this.#authOptions.serverEndpoint = payload.server_endpoint\n this.#authOptions.scope = payload.scope\n this.#authOptions.status = Object.values(EnumAppStatus).find(value => value === payload.status) || EnumAppStatus.Free\n\n this.#authExpires = this.#authOptions.expires * 1_000\n\n const authData = this.getAuthData() as AuthData\n\n if (this.#callbackRefreshAuth) {\n await this.#callbackRefreshAuth({ authData, b24OAuthParams: this.#authOptions })\n }\n\n return authData\n } catch (error) {\n if (error instanceof AxiosError) {\n const answerError = {\n code: error?.code || 0,\n description: error?.message || ''\n }\n\n if (\n error.response\n && error.response.data\n && !Type.isUndefined(error.response.data.error)\n ) {\n const responseData = error.response.data as TypeDescriptionError | TypeDescriptionErrorV3\n\n if (\n responseData.error\n && typeof responseData.error === 'object'\n && 'code' in responseData.error\n ) {\n answerError.code = responseData.error.code\n answerError.description = responseData.error.message\n if (responseData.error.validation) {\n responseData.error.validation.forEach((row) => {\n answerError.description += `${row?.message || JSON.stringify(row)}`\n })\n }\n } else if (responseData.error && typeof responseData.error === 'string') {\n answerError.code = responseData.error\n answerError.description = (responseData as TypeDescriptionError)?.error_description ?? answerError.description\n }\n }\n\n throw new RefreshTokenError({\n code: String(answerError.code),\n description: answerError.description,\n status: error.response?.status || 0\n })\n } else if (error instanceof Error) {\n throw error\n }\n\n throw new Error(\n `Strange error: ${error instanceof Error ? error.message : error}`,\n { cause: error }\n )\n }\n }\n\n public setCallbackRefreshAuth(cb: CallbackRefreshAuth): void {\n this.#callbackRefreshAuth = cb\n }\n\n public removeCallbackRefreshAuth(): void {\n this.#callbackRefreshAuth = null\n }\n\n public setCustomRefreshAuth(cb: CustomRefreshAuth): void {\n this.#customRefreshAuth = cb\n }\n\n public removeCustomRefreshAuth(): void {\n this.#customRefreshAuth = null\n }\n // endregion ////\n\n public getUniq(prefix: string): string {\n return [prefix, this.#authOptions.memberId || ''].join('_')\n }\n\n /**\n * @inheritDoc\n */\n public getTargetOrigin(): string {\n return `${this.#b24Target}`\n }\n\n /**\n * @inheritDoc\n */\n public getTargetOriginWithPath(): Map<ApiVersion, string> {\n return this.#b24TargetRestWithPath\n }\n\n /**\n * Determines whether the current user has administrator rights\n */\n get isAdmin(): boolean {\n if (null === this.#isAdmin) {\n throw new Error('isAdmin not init. You need call B24OAuth::initIsAdmin().')\n }\n\n return this.#isAdmin\n }\n\n public async initIsAdmin(http: TypeHttp, requestId?: string): Promise<void> {\n // set def value\n this.#isAdmin = false\n\n // region ver3 ////\n /**\n * This is just a template. When API.v3 arrives, we'll replace it.\n * @todo fix then the new API will be available\n */\n if (http.apiVersion === ApiVersion.v3) {\n const response = await http.call('profile', {}, requestId)\n if (!response.isSuccess) {\n throw new Error(response.getErrorMessages().join(';'))\n }\n\n const data: { profile: { id: number, admin: boolean } } = response.getData()!.result\n\n if (data.profile?.admin) {\n this.#isAdmin = true\n }\n\n return\n }\n // endregion ////\n\n // region ver2 ////\n const response = await http.call('profile', {}, requestId)\n if (!response.isSuccess) {\n throw new Error(response.getErrorMessages().join(';'))\n }\n\n const data: {\n ID: number\n ADMIN: boolean\n } = response.getData()!.result\n\n if (data?.ADMIN) {\n this.#isAdmin = true\n }\n // endregion ////\n }\n}\n"],"names":["response","data"],"mappings":"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"}