in packages/auth-compat/src/user_credential.ts [54:139]
function credentialFromObject(
object: FirebaseError | exp.UserCredential
): exp.AuthCredential | null {
const { _tokenResponse } = (
object instanceof FirebaseError ? object.customData : object
) as exp.TaggedWithTokenResponse;
if (!_tokenResponse) {
return null;
}
// Handle phone Auth credential responses, as they have a different format
// from other backend responses (i.e. no providerId). This is also only the
// case for user credentials (does not work for errors).
if (!(object instanceof FirebaseError)) {
if ('temporaryProof' in _tokenResponse && 'phoneNumber' in _tokenResponse) {
return exp.PhoneAuthProvider.credentialFromResult(object);
}
}
const providerId = _tokenResponse.providerId;
// Email and password is not supported as there is no situation where the
// server would return the password to the client.
if (!providerId || providerId === exp.ProviderId.PASSWORD) {
return null;
}
let provider: Pick<
typeof exp.OAuthProvider,
'credentialFromResult' | 'credentialFromError'
>;
switch (providerId) {
case exp.ProviderId.GOOGLE:
provider = exp.GoogleAuthProvider;
break;
case exp.ProviderId.FACEBOOK:
provider = exp.FacebookAuthProvider;
break;
case exp.ProviderId.GITHUB:
provider = exp.GithubAuthProvider;
break;
case exp.ProviderId.TWITTER:
provider = exp.TwitterAuthProvider;
break;
default:
const {
oauthIdToken,
oauthAccessToken,
oauthTokenSecret,
pendingToken,
nonce
} = _tokenResponse as exp.SignInWithIdpResponse;
if (
!oauthAccessToken &&
!oauthTokenSecret &&
!oauthIdToken &&
!pendingToken
) {
return null;
}
// TODO(avolkovi): uncomment this and get it working with SAML & OIDC
if (pendingToken) {
if (providerId.startsWith('saml.')) {
return exp.SAMLAuthCredential._create(providerId, pendingToken);
} else {
// OIDC and non-default providers excluding Twitter.
return exp.OAuthCredential._fromParams({
providerId,
signInMethod: providerId,
pendingToken,
idToken: oauthIdToken,
accessToken: oauthAccessToken
});
}
}
return new exp.OAuthProvider(providerId).credential({
idToken: oauthIdToken,
accessToken: oauthAccessToken,
rawNonce: nonce
});
}
return object instanceof FirebaseError
? provider.credentialFromError(object)
: provider.credentialFromResult(object);
}