Skip to content

Commit 37fa0ad

Browse files
authored
Merge pull request #99 from firebase/hkj-auth-version
Sending X-Client-Version header with auth requests
2 parents 4a5b618 + 730b987 commit 37fa0ad

File tree

3 files changed

+71
-1
lines changed

3 files changed

+71
-1
lines changed

FirebaseAdmin/FirebaseAdmin.Tests/Auth/FirebaseUserManagerTest.cs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using System.Linq;
1818
using System.Net;
1919
using System.Net.Http;
20+
using System.Net.Http.Headers;
2021
using System.Threading.Tasks;
2122
using FirebaseAdmin.Tests;
2223
using Google.Apis.Auth.OAuth2;
@@ -81,6 +82,7 @@ public async Task GetUserById()
8182

8283
var request = NewtonsoftJsonSerializer.Instance.Deserialize<Dictionary<string, object>>(handler.LastRequestBody);
8384
Assert.Equal(new JArray("user1"), request["localId"]);
85+
this.AssertClientVersion(handler.LastRequestHeaders);
8486
}
8587

8688
[Fact]
@@ -160,6 +162,8 @@ public async Task GetUserByIdWithProperties()
160162
Assert.NotNull(metadata);
161163
Assert.Equal(UserRecord.UnixEpoch.AddMilliseconds(100), metadata.CreationTimestamp);
162164
Assert.Equal(UserRecord.UnixEpoch.AddMilliseconds(150), metadata.LastSignInTimestamp);
165+
166+
this.AssertClientVersion(handler.LastRequestHeaders);
163167
}
164168

165169
[Fact]
@@ -217,6 +221,7 @@ public async Task GetUserByEmail()
217221

218222
var request = NewtonsoftJsonSerializer.Instance.Deserialize<Dictionary<string, object>>(handler.LastRequestBody);
219223
Assert.Equal(new JArray("[email protected]"), request["email"]);
224+
this.AssertClientVersion(handler.LastRequestHeaders);
220225
}
221226

222227
[Fact]
@@ -274,6 +279,7 @@ public async Task GetUserByPhoneNumber()
274279

275280
var request = NewtonsoftJsonSerializer.Instance.Deserialize<Dictionary<string, object>>(handler.LastRequestBody);
276281
Assert.Equal(new JArray("+1234567890"), request["phoneNumber"]);
282+
this.AssertClientVersion(handler.LastRequestHeaders);
277283
}
278284

279285
[Fact]
@@ -340,6 +346,9 @@ public async Task ListUsers()
340346
Assert.Equal(2, query.Count);
341347
Assert.Equal("1000", query["maxResults"]);
342348
Assert.Equal("token", query["nextPageToken"]);
349+
350+
this.AssertClientVersion(handler.Requests[0].Headers);
351+
this.AssertClientVersion(handler.Requests[1].Headers);
343352
}
344353

345354
[Fact]
@@ -377,6 +386,9 @@ public void ListUsersForEach()
377386
Assert.Equal(2, query.Count);
378387
Assert.Equal("1000", query["maxResults"]);
379388
Assert.Equal("token", query["nextPageToken"]);
389+
390+
this.AssertClientVersion(handler.Requests[0].Headers);
391+
this.AssertClientVersion(handler.Requests[1].Headers);
380392
}
381393

382394
[Fact]
@@ -416,6 +428,9 @@ public void ListUsersCustomOptions()
416428
Assert.Equal(2, query.Count);
417429
Assert.Equal("3", query["maxResults"]);
418430
Assert.Equal("token", query["nextPageToken"]);
431+
432+
this.AssertClientVersion(handler.Requests[0].Headers);
433+
this.AssertClientVersion(handler.Requests[1].Headers);
419434
}
420435

421436
[Fact]
@@ -451,6 +466,9 @@ public async Task ListUsersReadPage()
451466
query = this.ExtractQueryParams(handler.Requests[1]);
452467
Assert.Single(query);
453468
Assert.Equal("3", query["maxResults"]);
469+
470+
this.AssertClientVersion(handler.Requests[0].Headers);
471+
this.AssertClientVersion(handler.Requests[1].Headers);
454472
}
455473

456474
[Fact]
@@ -496,6 +514,9 @@ public async Task ListUsersByPages()
496514
{
497515
Assert.Equal($"user{i + 1}", users[i].Uid);
498516
}
517+
518+
this.AssertClientVersion(handler.Requests[0].Headers);
519+
this.AssertClientVersion(handler.Requests[1].Headers);
499520
}
500521

501522
[Fact]
@@ -521,6 +542,9 @@ public async Task ListUsersReadLargePageSize()
521542
Assert.Equal(2, query.Count);
522543
Assert.Equal("7", query["maxResults"]);
523544
Assert.Equal("token", query["nextPageToken"]);
545+
546+
this.AssertClientVersion(handler.Requests[0].Headers);
547+
this.AssertClientVersion(handler.Requests[1].Headers);
524548
}
525549

526550
[Fact]
@@ -562,6 +586,9 @@ public async Task ListUsersAsRawResponses()
562586
Assert.Equal(2, query.Count);
563587
Assert.Equal("1000", query["maxResults"]);
564588
Assert.Equal("token", query["nextPageToken"]);
589+
590+
this.AssertClientVersion(handler.Requests[0].Headers);
591+
this.AssertClientVersion(handler.Requests[1].Headers);
565592
}
566593

567594
[Fact]
@@ -698,6 +725,9 @@ public async Task CreateUser()
698725
Assert.Equal(2, handler.Requests.Count);
699726
var request = NewtonsoftJsonSerializer.Instance.Deserialize<JObject>(handler.Requests[0].Body);
700727
Assert.Empty(request);
728+
729+
this.AssertClientVersion(handler.Requests[0].Headers);
730+
this.AssertClientVersion(handler.Requests[1].Headers);
701731
}
702732

703733
[Fact]
@@ -731,6 +761,9 @@ public async Task CreateUserWithArgs()
731761
Assert.Equal("secret", request["password"]);
732762
Assert.Equal("+1234567890", request["phoneNumber"]);
733763
Assert.Equal("https://example.com/user.png", request["photoUrl"]);
764+
765+
this.AssertClientVersion(handler.Requests[0].Headers);
766+
this.AssertClientVersion(handler.Requests[1].Headers);
734767
}
735768

736769
[Fact]
@@ -759,6 +792,9 @@ public async Task CreateUserWithExplicitDefaults()
759792
Assert.Equal(2, request.Count);
760793
Assert.False((bool)request["disabled"]);
761794
Assert.False((bool)request["emailVerified"]);
795+
796+
this.AssertClientVersion(handler.Requests[0].Headers);
797+
this.AssertClientVersion(handler.Requests[1].Headers);
762798
}
763799

764800
[Fact]
@@ -956,6 +992,9 @@ public async Task UpdateUser()
956992
Assert.True((bool)claims["admin"]);
957993
Assert.Equal(4L, claims["level"]);
958994
Assert.Equal("gold", claims["package"]);
995+
996+
this.AssertClientVersion(handler.Requests[0].Headers);
997+
this.AssertClientVersion(handler.Requests[1].Headers);
959998
}
960999

9611000
[Fact]
@@ -979,6 +1018,9 @@ public async Task UpdateUserPartial()
9791018
Assert.Equal(2, request.Count);
9801019
Assert.Equal("user1", request["localId"]);
9811020
Assert.True((bool)request["emailVerified"]);
1021+
1022+
this.AssertClientVersion(handler.Requests[0].Headers);
1023+
this.AssertClientVersion(handler.Requests[1].Headers);
9821024
}
9831025

9841026
[Fact]
@@ -1005,6 +1047,9 @@ public async Task UpdateUserRemoveAttributes()
10051047
Assert.Equal(
10061048
new JArray() { "DISPLAY_NAME", "PHOTO_URL" },
10071049
request["deleteAttribute"]);
1050+
1051+
this.AssertClientVersion(handler.Requests[0].Headers);
1052+
this.AssertClientVersion(handler.Requests[1].Headers);
10081053
}
10091054

10101055
[Fact]
@@ -1030,6 +1075,9 @@ public async Task UpdateUserRemoveProviders()
10301075
Assert.Equal(
10311076
new JArray() { "phone" },
10321077
request["deleteProvider"]);
1078+
1079+
this.AssertClientVersion(handler.Requests[0].Headers);
1080+
this.AssertClientVersion(handler.Requests[1].Headers);
10331081
}
10341082

10351083
[Fact]
@@ -1053,6 +1101,8 @@ public async Task UpdateUserSetCustomClaims()
10531101
Assert.True((bool)claims["admin"]);
10541102
Assert.Equal(4L, claims["level"]);
10551103
Assert.Equal("gold", claims["package"]);
1104+
1105+
this.AssertClientVersion(handler.LastRequestHeaders);
10561106
}
10571107

10581108
[Fact]
@@ -1066,6 +1116,7 @@ public async Task LargeClaimsUnderLimit()
10661116
};
10671117

10681118
await auth.SetCustomUserClaimsAsync("user1", customClaims);
1119+
this.AssertClientVersion(handler.LastRequestHeaders);
10691120
}
10701121

10711122
[Fact]
@@ -1079,6 +1130,8 @@ public async Task EmptyClaims()
10791130
var request = NewtonsoftJsonSerializer.Instance.Deserialize<JObject>(handler.LastRequestBody);
10801131
Assert.Equal("user1", request["localId"]);
10811132
Assert.Equal("{}", request["customAttributes"]);
1133+
1134+
this.AssertClientVersion(handler.LastRequestHeaders);
10821135
}
10831136

10841137
[Fact]
@@ -1092,6 +1145,8 @@ public async Task NullClaims()
10921145
var request = NewtonsoftJsonSerializer.Instance.Deserialize<JObject>(handler.LastRequestBody);
10931146
Assert.Equal("user1", request["localId"]);
10941147
Assert.Equal("{}", request["customAttributes"]);
1148+
1149+
this.AssertClientVersion(handler.LastRequestHeaders);
10951150
}
10961151

10971152
[Fact]
@@ -1354,6 +1409,7 @@ public async Task DeleteUser()
13541409
var auth = this.CreateFirebaseAuth(handler);
13551410

13561411
await auth.DeleteUserAsync("user1");
1412+
this.AssertClientVersion(handler.LastRequestHeaders);
13571413
}
13581414

13591415
[Fact]
@@ -1390,5 +1446,12 @@ private IDictionary<string, string> ExtractQueryParams(MockMessageHandler.Incomi
13901446
return req.Url.Query.Substring(1).Split('&').ToDictionary(
13911447
entry => entry.Split('=')[0], entry => entry.Split('=')[1]);
13921448
}
1449+
1450+
private void AssertClientVersion(HttpRequestHeaders header)
1451+
{
1452+
Assert.Equal(
1453+
FirebaseUserManager.ClientVersion,
1454+
header.GetValues(FirebaseUserManager.ClientVersionHeader).First());
1455+
}
13931456
}
13941457
}

FirebaseAdmin/FirebaseAdmin/Auth/FirebaseUserManager.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ namespace FirebaseAdmin.Auth
3434
/// </summary>
3535
internal class FirebaseUserManager : IDisposable
3636
{
37+
internal const string ClientVersionHeader = "X-Client-Version";
38+
39+
internal static readonly string ClientVersion = $"DotNet/Admin/{FirebaseApp.GetSdkVersion()}";
40+
3741
private const string IdTooklitUrl = "https://identitytoolkit.googleapis.com/v1/projects/{0}";
3842

3943
private readonly ConfigurableHttpClient httpClient;
@@ -265,6 +269,7 @@ private async Task<string> PostAsync(
265269
private async Task<string> SendAsync(
266270
HttpRequestMessage request, CancellationToken cancellationToken)
267271
{
272+
request.Headers.Add(ClientVersionHeader, ClientVersion);
268273
try
269274
{
270275
var response = await this.httpClient.SendAsync(request, cancellationToken)

FirebaseAdmin/FirebaseAdmin/Auth/ListUsersRequest.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,13 @@ public HttpRequestMessage CreateRequest(bool? overrideGZipEnabled = null)
6161
{
6262
var queryParameters = string.Join("&", this.RequestParameters.Select(
6363
kvp => $"{kvp.Key}={kvp.Value.DefaultValue}"));
64-
return new HttpRequestMessage()
64+
var request = new HttpRequestMessage()
6565
{
6666
Method = System.Net.Http.HttpMethod.Get,
6767
RequestUri = new Uri($"{this.baseUrl}/{this.RestPath}?{queryParameters}"),
6868
};
69+
request.Headers.Add(FirebaseUserManager.ClientVersionHeader, FirebaseUserManager.ClientVersion);
70+
return request;
6971
}
7072

7173
public Task<Stream> ExecuteAsStreamAsync()

0 commit comments

Comments
 (0)