Skip to content

Commit 1ebb726

Browse files
authored
fix(auth): providerData issue (#420)
* fix(auth): providerData issue * fix(tests): Auth specs
1 parent 6219ac1 commit 1ebb726

File tree

5 files changed

+56
-73
lines changed

5 files changed

+56
-73
lines changed

src/auth/auth.spec.ts

+8-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { auth, initializeApp } from 'firebase';
2-
import {ReflectiveInjector, provide, Provider} from '@angular/core';
2+
import { ReflectiveInjector, provide, Provider } from '@angular/core';
33
import { Observable } from 'rxjs/Observable'
44
import { Observer } from 'rxjs/Observer';
55
import {
@@ -23,8 +23,8 @@ import {
2323
} from '../angularfire2';
2424
import { COMMON_CONFIG } from '../test-config';
2525

26-
import {AuthBackend} from './auth_backend';
27-
import {FirebaseSdkAuthBackend} from './firebase_sdk_auth_backend';
26+
import { AuthBackend } from './auth_backend';
27+
import { FirebaseSdkAuthBackend } from './firebase_sdk_auth_backend';
2828

2929
// Set providers from firebase so no firebase.auth.GoogleProvider() necessary
3030
const {
@@ -66,7 +66,6 @@ const anonymouseFirebaseUser = <firebase.User> {
6666

6767
const githubCredential = {
6868
credential: {
69-
accessToken: 'ACCESS_TOKEN',
7069
provider: 'github.com'
7170
},
7271
user: firebaseUser
@@ -77,15 +76,15 @@ const googleCredential = {
7776
user: firebaseUser
7877
}
7978

80-
const AngularFireAuthState = <FirebaseAuthState>{
79+
const AngularFireAuthState = {
8180
provider: 0,
8281
auth: firebaseUser,
8382
uid: '12345',
8483
github: {
85-
accessToken: 'GH_ACCESS_TOKEN',
86-
provider: 'github.com'
87-
}
88-
};
84+
displayName: 'FirebaseUser',
85+
providerId: 'github.com'
86+
} as firebase.UserInfo
87+
} as FirebaseAuthState;
8988

9089
describe('Zones', () => {
9190
it('should call operators and subscriber in the same zone as when service was initialized', (done) => {

src/auth/auth.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
AuthProviders,
1111
AuthMethods,
1212
EmailPasswordCredentials,
13-
OAuthCredential,
1413
AuthConfiguration,
1514
FirebaseAuthState,
1615
stripProviderId
@@ -29,7 +28,7 @@ export const firebaseAuthConfig = (config: AuthConfiguration): any => {
2928

3029
@Injectable()
3130
export class AngularFireAuth extends ReplaySubject<FirebaseAuthState> {
32-
private _credentialCache: {[key:string]: OAuthCredential} = {};
31+
private _credentialCache: {[key:string]: any} = {};
3332
constructor(private _authBackend: AuthBackend,
3433
@Inject(WindowLocation) loc: any,
3534
@Optional() @Inject(FirebaseAuthConfig) private _config?: AuthConfiguration) {
@@ -46,7 +45,7 @@ export class AngularFireAuth extends ReplaySubject<FirebaseAuthState> {
4645
.map((userCredential: firebase.auth.UserCredential) => {
4746
if (userCredential && userCredential.credential) {
4847
authState = attachCredentialToAuthState(authState, userCredential.credential, userCredential.credential.provider);
49-
this._credentialCache[userCredential.credential.provider] = <OAuthCredential>userCredential.credential;
48+
this._credentialCache[userCredential.credential.provider] = userCredential.credential;
5049
}
5150
return authState;
5251
});
@@ -102,8 +101,8 @@ export class AngularFireAuth extends ReplaySubject<FirebaseAuthState> {
102101
return this._authBackend.authWithOAuthPopup(config.provider, this._scrubConfig(config))
103102
.then((userCredential: firebase.auth.UserCredential) => {
104103
// Incorrect type information
105-
this._credentialCache[userCredential.credential.provider] = <OAuthCredential>userCredential.credential;
106-
return authDataToAuthState(userCredential.user, <OAuthCredential>(<any>userCredential).credential);
104+
this._credentialCache[userCredential.credential.provider] = userCredential.credential;
105+
return authDataToAuthState(userCredential.user, (<any>userCredential).credential);
107106
});
108107
case AuthMethods.Redirect:
109108
// Gets around typings issue since this method doesn't resolve with a user.

src/auth/auth_backend.spec.ts

+29-33
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import {
22
authDataToAuthState,
33
AuthProviders,
4-
FirebaseAuthState,
5-
CommonOAuthCredential,
6-
GoogleCredential,
7-
TwitterCredential
4+
FirebaseAuthState
85
} from './auth_backend';
96

107
const baseFBUser = {
@@ -25,94 +22,93 @@ const baseAuthState: FirebaseAuthState = {
2522
auth: <firebase.User>baseFBUser
2623
};
2724

28-
const baseGithubCredential: CommonOAuthCredential = {
29-
accessToken: 'GH_ACCESS_TOKEN',
30-
provider: 'github.com'
31-
};
25+
const baseGithubCredential = {
26+
providerId: 'github.com',
27+
displayName: 'GithubAlice'
28+
} as firebase.UserInfo;
3229

33-
const baseFacebookCredential: CommonOAuthCredential = {
34-
accessToken: 'FB_ACCESS_TOKEN',
35-
provider: 'facebook.com'
36-
};
30+
const baseFacebookCredential = {
31+
displayName: 'FacebookFranny',
32+
providerId: 'facebook.com'
33+
} as firebase.UserInfo;
3734

38-
const baseGoogleCredential: GoogleCredential = {
39-
idToken: 'GOOGLE_ID_TOKEN',
40-
provider: 'google.com'
41-
};
35+
const baseGoogleCredential = {
36+
displayName: 'GoogleGerry',
37+
providerId: 'google.com'
38+
} as firebase.UserInfo;
4239

43-
const baseTwitterCredential: TwitterCredential = {
44-
accessToken: 'TWITTER_ACCESS_TOKEN',
45-
provider: 'twitter.com',
46-
secret: 'TWITTER_SECRET'
47-
};
40+
const baseTwitterCredential = {
41+
displayName: 'TwitterTiffany',
42+
providerId: 'twitter.com',
43+
} as firebase.UserInfo;
4844

4945
describe('auth_backend', () => {
5046
describe('authDataToAuthState', () => {
5147
it('Github: should return a FirebaseAuthState object with full provider data', () => {
5248
let githubUser = Object.assign({}, baseFBUser, {
5349
providerData: [{providerId: 'github.com'}]
54-
});
50+
}) as firebase.User;
5551
let expectedAuthState = Object.assign({}, baseAuthState, {
5652
github: baseGithubCredential,
5753
auth: githubUser
5854
});
5955

6056
let actualAuthState = authDataToAuthState(githubUser, baseGithubCredential);
61-
expect(actualAuthState.github.accessToken).toEqual(baseGithubCredential.accessToken);
57+
expect(actualAuthState.github.displayName).toEqual(baseGithubCredential.displayName);
6258
});
6359
});
6460

6561
it('Google: should return a FirebaseAuthState object with full provider data', () => {
6662
let googleUser = Object.assign({}, baseFBUser, {
6763
providerData: [{providerId: 'google.com'}]
68-
});
64+
}) as firebase.User;
6965
let expectedAuthState = Object.assign({}, baseAuthState, {
7066
google: baseGoogleCredential,
7167
auth: googleUser
7268
});
7369

7470
let actualAuthState = authDataToAuthState(googleUser, baseGoogleCredential);
75-
expect(actualAuthState.google.idToken).toEqual(baseGoogleCredential.idToken);
71+
expect(actualAuthState.google.displayName).toEqual(baseGoogleCredential.displayName);
7672
});
7773

7874
it('Twitter: should return a FirebaseAuthState object with full provider data', () => {
7975
let twitterUser = Object.assign({}, baseFBUser, {
8076
providerData: [{providerId: 'twitter.com'}]
81-
});
77+
}) as firebase.User;
8278
let expectedAuthState = Object.assign({}, baseAuthState, {
8379
twitter: baseTwitterCredential,
8480
auth: twitterUser
8581
});
8682

8783
let actualAuthState = authDataToAuthState(twitterUser, baseTwitterCredential);
88-
expect(actualAuthState.twitter.secret).toEqual(baseTwitterCredential.secret);
84+
expect(actualAuthState.twitter.displayName).toEqual(baseTwitterCredential.displayName);
8985
});
9086

9187
it('Facebook: should return a FirebaseAuthState object with full provider data', () => {
9288
let facebookUser = Object.assign({}, baseFBUser, {
9389
providerData: [{providerId: 'facebook.com'}]
94-
});
90+
}) as firebase.User;
9591
let expectedAuthState = Object.assign({}, baseAuthState, {
9692
facebook: baseFacebookCredential,
9793
auth: facebookUser
9894
});
9995

10096
let actualAuthState = authDataToAuthState(facebookUser, baseFacebookCredential);
101-
expect(actualAuthState.facebook.accessToken).toEqual(baseFacebookCredential.accessToken);
97+
expect(actualAuthState.facebook.displayName).toEqual(baseFacebookCredential.displayName);
10298
});
10399

104100

105101
it('Anonymous: should return a FirebaseAuthState object', () => {
106-
let anonymouseFirebaseUser = Object.assign({}, baseFBUser, {
102+
let anonymousFirebaseUser = Object.assign({}, baseFBUser, {
107103
providerData: [],
108104
isAnonymous: true
109-
});
105+
}) as firebase.User;
110106
let expectedAuthState = Object.assign({}, baseAuthState, {
111107
facebook: baseFacebookCredential,
112-
auth: anonymouseFirebaseUser
108+
auth: anonymousFirebaseUser
113109
});
114110

115-
let actualAuthState = authDataToAuthState(anonymouseFirebaseUser);
111+
let actualAuthState = authDataToAuthState(anonymousFirebaseUser);
116112
expect(actualAuthState.anonymous).toEqual(true);
117113
});
118114
});

src/auth/auth_backend.ts

+14-25
Original file line numberDiff line numberDiff line change
@@ -46,30 +46,14 @@ export interface FirebaseAuthState {
4646
provider: AuthProviders;
4747
auth: firebase.User;
4848
expires?: number;
49-
github?: CommonOAuthCredential;
50-
google?: GoogleCredential;
51-
twitter?: TwitterCredential;
52-
facebook?: CommonOAuthCredential;
49+
github?: firebase.UserInfo;
50+
google?: firebase.UserInfo;
51+
twitter?: firebase.UserInfo;
52+
facebook?: firebase.UserInfo;
5353
anonymous?: boolean;
5454
}
5555

56-
export interface CommonOAuthCredential {
57-
accessToken: string;
58-
provider: 'github.com' | 'google.com' | 'twitter.com' | 'facebook.com';
59-
}
60-
61-
export interface GoogleCredential {
62-
idToken: string;
63-
provider: 'google.com';
64-
}
65-
66-
export interface TwitterCredential extends CommonOAuthCredential {
67-
secret: string;
68-
}
69-
70-
export type OAuthCredential = CommonOAuthCredential | GoogleCredential | TwitterCredential;
71-
72-
export function authDataToAuthState(authData: any, providerData?: OAuthCredential): FirebaseAuthState {
56+
export function authDataToAuthState(authData: firebase.User, providerData?: firebase.UserInfo): FirebaseAuthState {
7357
if (!authData) return null;
7458
let providerId;
7559
let { uid } = authData;
@@ -79,25 +63,30 @@ export function authDataToAuthState(authData: any, providerData?: OAuthCredentia
7963
authState.provider = AuthProviders.Anonymous;
8064
authState.anonymous = true;
8165
return authState;
66+
} else if (authData.providerData[0] === undefined || authData.providerData[0] === null) {
67+
// There is no provider data, user is likely custom
68+
providerId = 'custom';
69+
authState.provider = AuthProviders.Custom;
70+
return authState;
8271
} else {
8372
providerId = authData.providerData[0].providerId;
8473
}
8574

8675
switch (providerId) {
8776
case 'github.com':
88-
authState.github = <CommonOAuthCredential>providerData;
77+
authState.github = providerData;
8978
authState.provider = AuthProviders.Github;
9079
break;
9180
case 'twitter.com':
92-
authState.twitter = <TwitterCredential>providerData;
81+
authState.twitter = providerData;
9382
authState.provider = AuthProviders.Twitter;
9483
break;
9584
case 'facebook.com':
96-
authState.facebook = <CommonOAuthCredential>providerData;
85+
authState.facebook = providerData;
9786
authState.provider = AuthProviders.Facebook;
9887
break;
9988
case 'google.com':
100-
authState.google = <GoogleCredential>providerData;
89+
authState.google = providerData;
10190
authState.provider = AuthProviders.Google;
10291
break;
10392
case 'password':

src/auth/firebase_sdk_auth_backend.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export class FirebaseSdkAuthBackend extends AuthBackend {
4848
})
4949
.map((user: firebase.User) => {
5050
if (!user) return null;
51-
return authDataToAuthState(user);
51+
return authDataToAuthState(user, user.providerData[0]);
5252
})
5353
/**
5454
* TODO: since the auth service automatically subscribes to this before

0 commit comments

Comments
 (0)