Skip to content

Expose additionalUserInfo in auth-exp and auth-compat-exp #3595

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 12, 2020
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
4 changes: 3 additions & 1 deletion packages-exp/auth-compat-exp/src/user_credential.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import * as compat from '@firebase/auth-types';
import * as externs from '@firebase/auth-types-exp';
import '@firebase/installations';
import { User } from './user';
import { FirebaseError } from '@firebase/util';

function credentialFromResponse(
userCredential: impl.UserCredential
Expand Down Expand Up @@ -107,6 +106,9 @@ export async function convertCredential(
return {
operationType,
credential: credentialFromResponse(credential as impl.UserCredential),
additionalUserInfo: impl.getAdditionalUserInfo(
credential as impl.UserCredential
),
user: user as User
};
}
Expand Down
1 change: 1 addition & 0 deletions packages-exp/auth-exp/src/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ export {
} from './user/account_info';
export { getIdToken, getIdTokenResult } from './user/id_token_result';
export { unlink } from './user/link_unlink';
export { getAdditionalUserInfo } from './user/additional_user_info';

// Non-optional user methods.
export { reload } from './user/reload';
Expand Down
83 changes: 42 additions & 41 deletions packages-exp/auth-exp/src/core/user/additional_user_info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,21 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
AdditionalUserInfo,
UserProfile,
ProviderId
} from '@firebase/auth-types-exp';

import * as externs from '@firebase/auth-types-exp';
import { IdTokenResponse, IdTokenResponseKind } from '../../model/id_token';
import { _parseToken } from './id_token_result';
import { UserCredential } from '../../model/user';

/**
* Parse the `AdditionalUserInfo` from the ID token response.
*/
export function _fromIdTokenResponse(
idTokenResponse: IdTokenResponse
): AdditionalUserInfo | null {
idTokenResponse?: IdTokenResponse
): externs.AdditionalUserInfo | null {
if (!idTokenResponse) {
return null;
}
const { providerId } = idTokenResponse;
const profile = idTokenResponse.rawUserInfo
? JSON.parse(idTokenResponse.rawUserInfo)
Expand All @@ -41,8 +42,9 @@ export function _fromIdTokenResponse(
];
if (signInProvider) {
const filteredProviderId =
providerId !== ProviderId.ANONYMOUS && providerId !== ProviderId.CUSTOM
? (signInProvider as ProviderId)
providerId !== externs.ProviderId.ANONYMOUS &&
providerId !== externs.ProviderId.CUSTOM
? (signInProvider as externs.ProviderId)
: null;
// Uses generic class in accordance with the legacy SDK.
return new GenericAdditionalUserInfo(isNewUser, filteredProviderId);
Expand All @@ -52,83 +54,82 @@ export function _fromIdTokenResponse(
return null;
}
switch (providerId) {
case ProviderId.FACEBOOK:
case externs.ProviderId.FACEBOOK:
return new FacebookAdditionalUserInfo(isNewUser, profile);
case ProviderId.GITHUB:
case externs.ProviderId.GITHUB:
return new GithubAdditionalUserInfo(isNewUser, profile);
case ProviderId.GOOGLE:
case externs.ProviderId.GOOGLE:
return new GoogleAdditionalUserInfo(isNewUser, profile);
case ProviderId.TWITTER:
case externs.ProviderId.TWITTER:
return new TwitterAdditionalUserInfo(
isNewUser,
profile,
idTokenResponse.screenName || null
);
case ProviderId.CUSTOM:
case ProviderId.ANONYMOUS:
case externs.ProviderId.CUSTOM:
case externs.ProviderId.ANONYMOUS:
return new GenericAdditionalUserInfo(isNewUser, null);
default:
return new FederatedAdditionalUserInfo(isNewUser, providerId, profile);
return new GenericAdditionalUserInfo(isNewUser, providerId, profile);
}
}

class GenericAdditionalUserInfo implements AdditionalUserInfo {
class GenericAdditionalUserInfo implements externs.AdditionalUserInfo {
constructor(
readonly isNewUser: boolean,
readonly providerId: ProviderId | null
readonly providerId: externs.ProviderId | null,
readonly profile: externs.UserProfile = {}
) {}
}

class FederatedAdditionalUserInfo extends GenericAdditionalUserInfo {
class FederatedAdditionalUserInfoWithUsername extends GenericAdditionalUserInfo {
constructor(
isNewUser: boolean,
providerId: ProviderId,
readonly profile: UserProfile
) {
super(isNewUser, providerId);
}
}

class FederatedAdditionalUserInfoWithUsername extends FederatedAdditionalUserInfo {
constructor(
isNewUser: boolean,
providerId: ProviderId,
profile: UserProfile,
providerId: externs.ProviderId,
profile: externs.UserProfile,
readonly username: string | null
) {
super(isNewUser, providerId, profile);
}
}

class FacebookAdditionalUserInfo extends FederatedAdditionalUserInfo {
constructor(isNewUser: boolean, profile: UserProfile) {
super(isNewUser, ProviderId.FACEBOOK, profile);
class FacebookAdditionalUserInfo extends GenericAdditionalUserInfo {
constructor(isNewUser: boolean, profile: externs.UserProfile) {
super(isNewUser, externs.ProviderId.FACEBOOK, profile);
}
}

class GithubAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {
constructor(isNewUser: boolean, profile: UserProfile) {
constructor(isNewUser: boolean, profile: externs.UserProfile) {
super(
isNewUser,
ProviderId.GITHUB,
externs.ProviderId.GITHUB,
profile,
typeof profile?.login === 'string' ? profile?.login : null
);
}
}

class GoogleAdditionalUserInfo extends FederatedAdditionalUserInfo {
constructor(isNewUser: boolean, profile: UserProfile) {
super(isNewUser, ProviderId.GOOGLE, profile);
class GoogleAdditionalUserInfo extends GenericAdditionalUserInfo {
constructor(isNewUser: boolean, profile: externs.UserProfile) {
super(isNewUser, externs.ProviderId.GOOGLE, profile);
}
}

class TwitterAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {
constructor(
isNewUser: boolean,
profile: UserProfile,
profile: externs.UserProfile,
screenName: string | null
) {
super(isNewUser, ProviderId.TWITTER, profile, screenName);
super(isNewUser, externs.ProviderId.TWITTER, profile, screenName);
}
}

export function getAdditionalUserInfo(
userCredential: externs.UserCredential
): externs.AdditionalUserInfo | null {
return _fromIdTokenResponse(
(userCredential as UserCredential)._tokenResponse
);
}
2 changes: 1 addition & 1 deletion packages-exp/auth-types-exp/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ export interface UserMetadata {
*/
export interface AdditionalUserInfo {
readonly isNewUser: boolean;
readonly profile?: UserProfile;
readonly profile: UserProfile | null;
readonly providerId: ProviderId | null;
readonly username?: string | null;
}
Expand Down
2 changes: 1 addition & 1 deletion packages/auth-types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ export type ActionCodeSettings = {
export type AdditionalUserInfo = {
isNewUser: boolean;
profile: Object | null;
providerId: string;
providerId: string | null;
Copy link
Contributor Author

@avolkovi avolkovi Aug 10, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was an oversight in the old public types

username?: string | null;
};

Expand Down