Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
f3b3caa
chore(core): Automate Daily Integration Tests (#1130)
lahirumaramba Jan 12, 2021
8ae44ce
Updating Google Cloud naming (#1122)
egilmorez Jan 14, 2021
1862342
update typo in interface name (#1138)
suchcodemuchwow Jan 22, 2021
6ce98e2
Improve token verification logic with Auth Emulator. (#1148)
yuchenshi Feb 4, 2021
01d8177
feat: Exporting all types of Messages so they can be used by consumer…
BorntraegerMarc Feb 4, 2021
fc2f557
feat(auth): Implement getUserByProviderId (#769)
rsgowman Feb 8, 2021
a00ce05
Allow enabling of anonymous provider via tenant configuration (#802)
rsgowman Feb 8, 2021
bea66a9
feat(auth): Add ability to link a federated ID with the `updateUser()…
rsgowman Feb 9, 2021
5c60cc4
(chore): Export UserProvider type and add it to toc.yaml (#1165)
lahirumaramba Feb 10, 2021
9585775
[chore] Release 9.5.0 (#1167)
lahirumaramba Feb 10, 2021
93362d5
chore: Updated doc generator for typedoc 0.19.0 (#1166)
hiranya911 Feb 11, 2021
6bcffa2
Update HOME.md (#1181)
egilmorez Feb 26, 2021
994fd43
feat(rtdb): Support emulator mode for rules management operations (#1…
hiranya911 Mar 10, 2021
bf4bacb
fix: Decoupled proactive token refresh from FirebaseApp (#1194)
hiranya911 Mar 18, 2021
738eba7
fix(rtdb): Fixing the RTDB token listener callback (#1203)
hiranya911 Mar 19, 2021
97d3823
Add emulator-based integration tests. (#1155)
yuchenshi Mar 23, 2021
19660d9
Disable one flaky tests in emulator. (#1205)
yuchenshi Mar 25, 2021
2a5b7f6
[chore] Release 9.6.0 (#1209)
hiranya911 Mar 29, 2021
60b4e29
(chore): Add JWT Decoder and Signature Verifier (#1204)
lahirumaramba Mar 30, 2021
1254850
chore: Add Mailgun send email action (#1210)
lahirumaramba Mar 31, 2021
e9e8a03
chore: Fix bug in send-email action code (#1214)
lahirumaramba Apr 1, 2021
1cc82ae
Change dispatch event name in nightly workflow (#1216)
lahirumaramba Apr 1, 2021
d961c3f
chore: Clean up nightly workflow trigger tests (#1212)
lahirumaramba Apr 1, 2021
da0f44f
Add support for FIREBASE_STORAGE_EMULATOR_HOST env var (#1175)
abeisgoat Apr 8, 2021
011c530
Revert "Disable one flaky tests in emulator. (#1205)" (#1227)
yuchenshi Apr 14, 2021
58f60d6
fix(rtdb): Fixing a token refresh livelock in Cloud Functions (#1234)
hiranya911 Apr 23, 2021
be4ebc6
[chore] Release 9.7.0 (#1240)
lahirumaramba Apr 27, 2021
c6e9ef7
fix: adds missing EMAIL_NOT_FOUND error code (#1246)
bojeil-google May 3, 2021
d8b769a
build(deps-dev): bump lodash from 4.17.19 to 4.17.21 (#1255)
dependabot[bot] May 6, 2021
43bfbd9
chore: Upgraded RTDB and other @firebase dependencies (#1250)
hiranya911 May 6, 2021
e65dbcf
build(deps): bump y18n from 3.2.1 to 3.2.2 (#1208)
dependabot[bot] May 6, 2021
3ae6a69
Fix storage emulator env formatting (#1257)
abeisgoat May 10, 2021
8267b56
build(deps): bump hosted-git-info from 2.8.8 to 2.8.9 (#1260)
dependabot[bot] May 10, 2021
b88f891
feat: Add abuse reduction support (#1264)
lahirumaramba May 10, 2021
ab034f5
Fix @types/node conflict with grpc and port type (#1258)
nikhilag May 10, 2021
e5dc9f8
[chore] Release 9.8.0 (#1266)
lahirumaramba May 10, 2021
e759958
build(deps): bump handlebars from 4.7.6 to 4.7.7 (#1253)
dependabot[bot] May 10, 2021
e7155ea
build(deps): bump jose from 2.0.4 to 2.0.5 (#1265)
dependabot[bot] May 10, 2021
fd23ad0
fix: Revert regression introduced in #1257 (#1277)
hiranya911 May 18, 2021
3b48235
fix(auth): make MFA uid optional for updateUser operations (#1278)
bojeil-google May 18, 2021
3a2d2fa
chore: Enabled dependabot (#1279)
hiranya911 May 20, 2021
6bf2aee
chore: Remove gulp-replace dependency (#1285)
hiranya911 May 20, 2021
11f2fb1
build(deps-dev): bump gulp-header from 1.8.12 to 2.0.9 (#1283)
dependabot[bot] May 20, 2021
df3b398
build(deps-dev): bump run-sequence from 1.2.2 to 2.2.1 (#1282)
dependabot[bot] May 20, 2021
89387c1
build(deps-dev): bump sinon from 9.0.2 to 9.2.4 (#1289)
dependabot[bot] May 24, 2021
a549a6c
build(deps-dev): bump nyc from 14.1.1 to 15.1.0 (#1290)
dependabot[bot] May 24, 2021
d6dcf9e
build(deps-dev): bump chalk from 1.1.3 to 4.1.1 (#1288)
dependabot[bot] May 24, 2021
9d87537
build(deps-dev): bump @microsoft/api-extractor from 7.11.2 to 7.15.2 …
dependabot[bot] May 24, 2021
7afaf6c
chore: Teporarily disabling sendToDeviceGroup integration test (#1292)
hiranya911 May 24, 2021
1d2ff69
feat(auth): Added code flow support for OIDC flow. (#1220)
xil222 May 25, 2021
03c66d8
Update supported Node version to 10.13.0v (#1300)
lahirumaramba May 26, 2021
f914f92
Fixed integration test failure of skipped tests (#1299)
xil222 May 26, 2021
c529496
[chore] Release 9.9.0 (#1302)
lahirumaramba May 26, 2021
2ffc177
Update OIDC reference docs (#1305)
lahirumaramba May 27, 2021
f4a9a16
Add OAuthResponseType to ToC (#1303)
lahirumaramba May 27, 2021
29271ad
fix(auth): Better type hierarchies for Auth API (#1294)
hiranya911 May 27, 2021
5d5cea2
build(deps-dev): bump nock from 13.0.5 to 13.0.11 (#1311)
dependabot[bot] Jun 1, 2021
09e82c0
build(deps): bump ws from 7.3.1 to 7.4.6 (#1309)
dependabot[bot] Jun 1, 2021
312cdbb
build(deps-dev): bump del from 2.2.2 to 6.0.0 (#1310)
dependabot[bot] Jun 1, 2021
278bfc9
build(deps-dev): bump @types/jsonwebtoken from 8.5.0 to 8.5.1 (#1315)
dependabot[bot] Jun 1, 2021
2256f03
build(deps-dev): bump nock from 13.0.11 to 13.1.0 (#1313)
dependabot[bot] Jun 1, 2021
2e6e5d3
build(deps-dev): bump @types/sinon-chai from 3.2.4 to 3.2.5 (#1316)
dependabot[bot] Jun 1, 2021
8548bb3
build(deps-dev): bump bcrypt from 5.0.0 to 5.0.1 (#1324)
dependabot[bot] Jun 9, 2021
eb04602
build(deps): bump @google-cloud/firestore from 4.5.0 to 4.12.2 (#1325)
dependabot[bot] Jun 9, 2021
3c78a73
build(deps-dev): bump @types/mocha from 2.2.48 to 8.2.2 (#1323)
dependabot[bot] Jun 9, 2021
2a4de46
build(deps-dev): bump @firebase/app from 0.6.21 to 0.6.26 (#1329)
dependabot[bot] Jun 14, 2021
24d3b91
build(deps): bump @firebase/database from 0.10.0 to 0.10.4 (#1328)
dependabot[bot] Jun 14, 2021
f09bd64
build(deps-dev): bump request-promise from 4.2.5 to 4.2.6 (#1331)
dependabot[bot] Jun 14, 2021
9539a50
build(deps-dev): bump gulp-filter from 6.0.0 to 7.0.0 (#1334)
dependabot[bot] Jun 22, 2021
9b0d7ef
build(deps-dev): bump @types/minimist from 1.2.0 to 1.2.1 (#1336)
dependabot[bot] Jun 22, 2021
9872b9b
fix(docs): replace all global.html -> admin.html (#1341)
NothingEverHappens Jun 22, 2021
0f9a7de
feat(fis): Adding the admin.installations() API for deleting Firebase…
hiranya911 Jun 23, 2021
6f73c8c
fix: Updated TOC for new Auth type aliases (#1342)
hiranya911 Jun 23, 2021
2ca2bca
[chore] Release 9.10.0 (#1345)
hiranya911 Jun 24, 2021
2feece3
build(deps-dev): bump @types/request-promise from 4.1.46 to 4.1.47 (#…
dependabot[bot] Jun 24, 2021
dd942b0
build(deps): bump @firebase/database from 0.10.4 to 0.10.5 (#1350)
dependabot[bot] Jul 2, 2021
bf959e3
build(deps-dev): bump @types/nock from 9.3.1 to 11.1.0 (#1351)
dependabot[bot] Jul 2, 2021
e9cd6bf
build(deps-dev): bump @types/sinon from 9.0.4 to 10.0.2 (#1326)
dependabot[bot] Jul 2, 2021
068ea80
build(deps): bump @firebase/database from 0.10.5 to 0.10.6 (#1356)
dependabot[bot] Jul 5, 2021
b8e837b
build(deps): bump jwks-rsa from 2.0.2 to 2.0.3 (#1361)
dependabot[bot] Jul 9, 2021
c87f640
build(deps-dev): bump yargs from 16.1.0 to 17.0.1 (#1357)
dependabot[bot] Jul 9, 2021
0b45481
build(deps-dev): bump @types/chai from 4.2.11 to 4.2.21 (#1365)
dependabot[bot] Jul 9, 2021
bfaec79
Update index.ts (#1367)
dhritzkiv Jul 12, 2021
760cd6a
build(deps): bump @google-cloud/firestore from 4.12.2 to 4.13.1 (#1369)
dependabot[bot] Jul 12, 2021
4e816f4
feat(fac): Add custom TTL options for App Check (#1363)
lahirumaramba Jul 14, 2021
c2b126b
Reduce App Check custom token exp to 5 mins (#1372)
lahirumaramba Jul 14, 2021
ba07e12
Add AppCheckTokenOptions type to ToC (#1375)
lahirumaramba Jul 15, 2021
21869ee
Fix typo and formatting in docs (#1378)
lahirumaramba Jul 15, 2021
20dc462
[chore] Release 9.11.0 (#1376)
lahirumaramba Jul 15, 2021
db13ec1
build(deps-dev): bump nock from 13.1.0 to 13.1.1 (#1370)
dependabot[bot] Jul 15, 2021
25429b3
build(deps-dev): bump @types/bcrypt from 2.0.0 to 5.0.0 (#1384)
dependabot[bot] Jul 19, 2021
b403c15
build(deps): bump @firebase/database from 0.10.6 to 0.10.7 (#1385)
dependabot[bot] Jul 19, 2021
8bfbadf
build(deps-dev): bump @types/lodash from 4.14.157 to 4.14.171 (#1386)
dependabot[bot] Jul 20, 2021
6841d4c
build(deps-dev): bump @types/request from 2.48.5 to 2.48.6 (#1387)
dependabot[bot] Jul 20, 2021
9ad3be7
build(deps-dev): bump @types/minimist from 1.2.1 to 1.2.2 (#1388)
dependabot[bot] Jul 20, 2021
2e5e473
build(deps): bump jwks-rsa from 2.0.3 to 2.0.4 (#1393)
dependabot[bot] Jul 27, 2021
63d12e0
build(deps-dev): bump @microsoft/api-extractor from 7.15.2 to 7.18.4 …
dependabot[bot] Aug 3, 2021
8474194
build(deps): bump tar from 6.1.0 to 6.1.3 (#1399)
dependabot[bot] Aug 3, 2021
a9d8b41
build(deps-dev): bump ts-node from 9.0.0 to 10.2.0 (#1402)
dependabot[bot] Aug 9, 2021
e22f0ef
chore: Add emulator tests to nightlies (#1409)
lahirumaramba Aug 16, 2021
9f7529f
fix: Throw error on user disabled and check revoked set true (#1401)
xil222 Aug 16, 2021
7d92a34
build(deps-dev): bump yargs from 17.0.1 to 17.1.1 (#1412)
dependabot[bot] Aug 17, 2021
973e68b
build(deps): bump path-parse from 1.0.6 to 1.0.7 (#1413)
dependabot[bot] Aug 17, 2021
e7ab2f0
fix: Update comments in index files (#1414)
xil222 Aug 19, 2021
ceaad33
[chore] Release 9.11.1 (#1415)
lahirumaramba Aug 19, 2021
3f432df
fix typo (#1420)
arthurgubaidullin Aug 27, 2021
bb1fb6f
build(deps-dev): bump @microsoft/api-extractor from 7.18.4 to 7.18.7 …
dependabot[bot] Aug 27, 2021
82391d5
feat(rc): Add Remote Config Parameter Value Type Support (#1424)
lahirumaramba Sep 14, 2021
b4b220c
build(deps-dev): bump @types/lodash from 4.14.171 to 4.14.173 (#1435)
dependabot[bot] Sep 20, 2021
8610b94
build(deps): bump tar from 6.1.3 to 6.1.11 (#1430)
dependabot[bot] Sep 20, 2021
d96e61b
Pin @types/jsonwebtoken to 8.5.1 (#1438)
lahirumaramba Sep 23, 2021
894b04a
fix(rtdb): Changed admin.database to use database-compat package (#1437)
hiranya911 Sep 27, 2021
a0b71a2
fix(fac): Verify Token: Change the jwks cache duration from 1 day to …
lahirumaramba Sep 28, 2021
137905c
[chore] Release 9.12.0 (#1442)
lahirumaramba Sep 28, 2021
e4b6a5f
chore: Merged with main branch
hiranya911 Sep 30, 2021
aa534ad
fix: Merged missing commits from #1401
hiranya911 Sep 30, 2021
c87ce53
fix: Updated integration tests
hiranya911 Sep 30, 2021
5d67bcc
fix: Temporary with for RTDB type incompatibility issue
hiranya911 Sep 30, 2021
8406d4e
fix: Cleaned up faulty API doc annotations
hiranya911 Sep 30, 2021
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
Prev Previous commit
Next Next commit
feat(auth): Add ability to link a federated ID with the `updateUser()…
…` method. (#770)
  • Loading branch information
rsgowman authored Feb 9, 2021
commit bea66a90b12408313c3f1b54b67e19cc32c25421
11 changes: 11 additions & 0 deletions etc/firebase-admin.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,8 @@ export namespace auth {
password?: string;
phoneNumber?: string | null;
photoURL?: string | null;
providersToUnlink?: string[];
providerToLink?: UserProvider;
}
export interface UpdateTenantRequest {
anonymousSignInEnabled?: boolean;
Expand Down Expand Up @@ -365,6 +367,14 @@ export namespace auth {
creationTime?: string;
lastSignInTime?: string;
}
export interface UserProvider {
displayName?: string;
email?: string;
phoneNumber?: string;
photoURL?: string;
providerId?: string;
uid?: string;
}
export interface UserProviderRequest {
displayName?: string;
email?: string;
Expand Down Expand Up @@ -393,6 +403,7 @@ export namespace auth {
tokensValidAfterTime?: string;
uid: string;
}
{};
}

// @public (undocumented)
Expand Down
57 changes: 52 additions & 5 deletions src/auth/auth-api-request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,8 @@ function validateCreateEditRequest(request: any, writeOperationType: WriteOperat
phoneNumber: true,
customAttributes: true,
validSince: true,
// Pass linkProviderUserInfo only for updates (i.e. not for uploads.)
linkProviderUserInfo: !uploadAccountRequest,
// Pass tenantId only for uploadAccount requests.
tenantId: uploadAccountRequest,
passwordHash: uploadAccountRequest,
Expand Down Expand Up @@ -551,6 +553,12 @@ function validateCreateEditRequest(request: any, writeOperationType: WriteOperat
validateProviderUserInfo(providerUserInfoEntry);
});
}

// linkProviderUserInfo must be a (single) UserProvider value.
if (typeof request.linkProviderUserInfo !== 'undefined') {
validateProviderUserInfo(request.linkProviderUserInfo);
}

// mfaInfo is used for importUsers.
// mfa.enrollments is used for setAccountInfo.
// enrollments has to be an array of valid AuthFactorInfo requests.
Expand Down Expand Up @@ -1306,6 +1314,33 @@ export abstract class AbstractAuthRequestHandler {
'Properties argument must be a non-null object.',
),
);
} else if (validator.isNonNullObject(properties.providerToLink)) {
// TODO(rsgowman): These checks overlap somewhat with
// validateProviderUserInfo. It may be possible to refactor a bit.
if (!validator.isNonEmptyString(properties.providerToLink.providerId)) {
throw new FirebaseAuthError(
AuthClientErrorCode.INVALID_ARGUMENT,
'providerToLink.providerId of properties argument must be a non-empty string.');
}
if (!validator.isNonEmptyString(properties.providerToLink.uid)) {
throw new FirebaseAuthError(
AuthClientErrorCode.INVALID_ARGUMENT,
'providerToLink.uid of properties argument must be a non-empty string.');
}
} else if (typeof properties.providersToUnlink !== 'undefined') {
if (!validator.isArray(properties.providersToUnlink)) {
throw new FirebaseAuthError(
AuthClientErrorCode.INVALID_ARGUMENT,
'providersToUnlink of properties argument must be an array of strings.');
}

properties.providersToUnlink.forEach((providerId) => {
if (!validator.isNonEmptyString(providerId)) {
throw new FirebaseAuthError(
AuthClientErrorCode.INVALID_ARGUMENT,
'providersToUnlink of properties argument must be an array of strings.');
}
});
}

// Build the setAccountInfo request.
Expand Down Expand Up @@ -1340,13 +1375,25 @@ export abstract class AbstractAuthRequestHandler {
// It will be removed from the backend request and an additional parameter
// deleteProvider: ['phone'] with an array of providerIds (phone in this case),
// will be passed.
// Currently this applies to phone provider only.
if (request.phoneNumber === null) {
request.deleteProvider = ['phone'];
request.deleteProvider ? request.deleteProvider.push('phone') : request.deleteProvider = ['phone'];
delete request.phoneNumber;
} else {
// Doesn't apply to other providers in admin SDK.
delete request.deleteProvider;
}

if (typeof(request.providerToLink) !== 'undefined') {
request.linkProviderUserInfo = deepCopy(request.providerToLink);
delete request.providerToLink;

request.linkProviderUserInfo.rawId = request.linkProviderUserInfo.uid;
delete request.linkProviderUserInfo.uid;
}

if (typeof(request.providersToUnlink) !== 'undefined') {
if (!validator.isArray(request.deleteProvider)) {
request.deleteProvider = [];
}
request.deleteProvider = request.deleteProvider.concat(request.providersToUnlink);
delete request.providersToUnlink;
}

// Rewrite photoURL to photoUrl.
Expand Down
45 changes: 45 additions & 0 deletions src/auth/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
* limitations under the License.
*/

import { deepCopy } from '../utils/deep-copy';
import { UserRecord } from './user-record';
import {
isUidIdentifier, isEmailIdentifier, isPhoneIdentifier, isProviderIdentifier,
Expand Down Expand Up @@ -381,6 +382,50 @@ export class BaseAuth<T extends AbstractAuthRequestHandler> implements BaseAuthI
* @return {Promise<UserRecord>} A promise that resolves with the modified user record.
*/
public updateUser(uid: string, properties: UpdateRequest): Promise<UserRecord> {
// Although we don't really advertise it, we want to also handle linking of
// non-federated idps with this call. So if we detect one of them, we'll
// adjust the properties parameter appropriately. This *does* imply that a
// conflict could arise, e.g. if the user provides a phoneNumber property,
// but also provides a providerToLink with a 'phone' provider id. In that
// case, we'll throw an error.
properties = deepCopy(properties);

if (properties?.providerToLink) {
if (properties.providerToLink.providerId === 'email') {
if (typeof properties.email !== 'undefined') {
throw new FirebaseAuthError(
AuthClientErrorCode.INVALID_ARGUMENT,
"Both UpdateRequest.email and UpdateRequest.providerToLink.providerId='email' were set. To "
+ 'link to the email/password provider, only specify the UpdateRequest.email field.');
}
properties.email = properties.providerToLink.uid;
delete properties.providerToLink;
} else if (properties.providerToLink.providerId === 'phone') {
if (typeof properties.phoneNumber !== 'undefined') {
throw new FirebaseAuthError(
AuthClientErrorCode.INVALID_ARGUMENT,
"Both UpdateRequest.phoneNumber and UpdateRequest.providerToLink.providerId='phone' were set. To "
+ 'link to a phone provider, only specify the UpdateRequest.phoneNumber field.');
}
properties.phoneNumber = properties.providerToLink.uid;
delete properties.providerToLink;
}
}
if (properties?.providersToUnlink) {
if (properties.providersToUnlink.indexOf('phone') !== -1) {
// If we've been told to unlink the phone provider both via setting
// phoneNumber to null *and* by setting providersToUnlink to include
// 'phone', then we'll reject that. Though it might also be reasonable
// to relax this restriction and just unlink it.
if (properties.phoneNumber === null) {
throw new FirebaseAuthError(
AuthClientErrorCode.INVALID_ARGUMENT,
"Both UpdateRequest.phoneNumber=null and UpdateRequest.providersToUnlink=['phone'] were set. To "
+ 'unlink from a phone provider, only specify the UpdateRequest.phoneNumber=null field.');
}
}
}

return this.authRequestHandler.updateExistingAccount(uid, properties)
.then((existingUid) => {
// Return the corresponding user record.
Expand Down
56 changes: 56 additions & 0 deletions src/auth/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,42 @@ export namespace auth {
phoneNumber: string;
}

/**
* Represents a user identity provider that can be associated with a Firebase user.
*/
interface UserProvider {

/**
* The user identifier for the linked provider.
*/
uid?: string;

/**
* The display name for the linked provider.
*/
displayName?: string;

/**
* The email for the linked provider.
*/
email?: string;

/**
* The phone number for the linked provider.
*/
phoneNumber?: string;

/**
* The photo URL for the linked provider.
*/
photoURL?: string;

/**
* The linked provider ID (for example, "google.com" for the Google provider).
*/
providerId?: string;
}

/**
* Interface representing a user.
*/
Expand Down Expand Up @@ -384,6 +420,26 @@ export namespace auth {
* The user's updated multi-factor related properties.
*/
multiFactor?: MultiFactorUpdateSettings;

/**
* Links this user to the specified provider.
*
* Linking a provider to an existing user account does not invalidate the
* refresh token of that account. In other words, the existing account
* would continue to be able to access resources, despite not having used
* the newly linked provider to log in. If you wish to force the user to
* authenticate with this new provider, you need to (a) revoke their
* refresh token (see
* https://firebase.google.com/docs/auth/admin/manage-sessions#revoke_refresh_tokens),
* and (b) ensure no other authentication methods are present on this
* account.
*/
providerToLink?: UserProvider;

/**
* Unlinks this user from the specified providers.
*/
providersToUnlink?: string[];
}

/**
Expand Down
Loading