voluptasmollitia
Version:
Monorepo for the Firebase JavaScript SDK
120 lines (105 loc) • 3.53 kB
text/typescript
/**
* @license
* Copyright 2021 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { SDK_VERSION } from '@firebase/app-exp';
import { AuthProvider } from '../../model/public_types';
import { ApiKey, AppName, AuthInternal } from '../../model/auth';
import { AuthEventType } from '../../model/popup_redirect';
import { AuthErrorCode } from '../errors';
import { _assert } from './assert';
import { isEmpty, querystring } from '@firebase/util';
import { _emulatorUrl } from './emulator';
import { FederatedAuthProvider } from '../providers/federated';
import { BaseOAuthProvider } from '../providers/oauth';
/**
* URL for Authentication widget which will initiate the OAuth handshake
*
* @internal
*/
const WIDGET_PATH = '__/auth/handler';
/**
* URL for emulated environment
*
* @internal
*/
const EMULATOR_WIDGET_PATH = 'emulator/auth/handler';
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
type WidgetParams = {
apiKey: ApiKey;
appName: AppName;
authType: AuthEventType;
redirectUrl?: string;
v: string;
providerId?: string;
scopes?: string;
customParameters?: string;
eventId?: string;
tid?: string;
} & { [key: string]: string | undefined };
export function _getRedirectUrl(
auth: AuthInternal,
provider: AuthProvider,
authType: AuthEventType,
redirectUrl?: string,
eventId?: string,
additionalParams?: Record<string, string>
): string {
_assert(auth.config.authDomain, auth, AuthErrorCode.MISSING_AUTH_DOMAIN);
_assert(auth.config.apiKey, auth, AuthErrorCode.INVALID_API_KEY);
const params: WidgetParams = {
apiKey: auth.config.apiKey,
appName: auth.name,
authType,
redirectUrl,
v: SDK_VERSION,
eventId
};
if (provider instanceof FederatedAuthProvider) {
provider.setDefaultLanguage(auth.languageCode);
params.providerId = provider.providerId || '';
if (!isEmpty(provider.getCustomParameters())) {
params.customParameters = JSON.stringify(provider.getCustomParameters());
}
// TODO set additionalParams from the provider as well?
for (const [key, value] of Object.entries(additionalParams || {})) {
params[key] = value;
}
}
if (provider instanceof BaseOAuthProvider) {
const scopes = provider.getScopes().filter(scope => scope !== '');
if (scopes.length > 0) {
params.scopes = scopes.join(',');
}
}
if (auth.tenantId) {
params.tid = auth.tenantId;
}
// TODO: maybe set eid as endipointId
// TODO: maybe set fw as Frameworks.join(",")
const paramsDict = params as Record<string, string | number>;
for (const key of Object.keys(paramsDict)) {
if (paramsDict[key] === undefined) {
delete paramsDict[key];
}
}
return `${getHandlerBase(auth)}?${querystring(paramsDict).slice(1)}`;
}
function getHandlerBase({ config }: AuthInternal): string {
if (!config.emulator) {
return `https://${config.authDomain}/${WIDGET_PATH}`;
}
return _emulatorUrl(config, EMULATOR_WIDGET_PATH);
}