20
20
using System . Security . Cryptography . X509Certificates ;
21
21
using System . Threading ;
22
22
using System . Threading . Tasks ;
23
- using FirebaseAdmin . Auth ;
24
23
using FirebaseAdmin . Tests ;
25
24
using Google . Apis . Auth . OAuth2 ;
26
25
using Google . Apis . Util ;
@@ -89,8 +88,10 @@ await Assert.ThrowsAsync<ArgumentException>(
89
88
[ Fact ]
90
89
public async Task MalformedToken ( )
91
90
{
92
- await Assert . ThrowsAsync < FirebaseException > (
91
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
93
92
async ( ) => await TokenVerifier . VerifyTokenAsync ( "not-a-token" ) ) ;
93
+
94
+ this . CheckException ( exception , "Incorrect number of segments in ID token." ) ;
94
95
}
95
96
96
97
[ Fact ]
@@ -101,8 +102,10 @@ public async Task NoKid()
101
102
{ "kid" , string . Empty } ,
102
103
} ;
103
104
var idToken = await CreateTestTokenAsync ( headerOverrides : header ) ;
104
- await Assert . ThrowsAsync < FirebaseException > (
105
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
105
106
async ( ) => await TokenVerifier . VerifyTokenAsync ( idToken ) ) ;
107
+
108
+ this . CheckException ( exception , "Firebase ID token has no 'kid' claim." ) ;
106
109
}
107
110
108
111
[ Fact ]
@@ -113,8 +116,10 @@ public async Task IncorrectKid()
113
116
{ "kid" , "incorrect-key-id" } ,
114
117
} ;
115
118
var idToken = await CreateTestTokenAsync ( headerOverrides : header ) ;
116
- await Assert . ThrowsAsync < FirebaseException > (
119
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
117
120
async ( ) => await TokenVerifier . VerifyTokenAsync ( idToken ) ) ;
121
+
122
+ this . CheckException ( exception , "Failed to verify ID token signature." ) ;
118
123
}
119
124
120
125
[ Fact ]
@@ -125,8 +130,12 @@ public async Task IncorrectAlgorithm()
125
130
{ "alg" , "HS256" } ,
126
131
} ;
127
132
var idToken = await CreateTestTokenAsync ( headerOverrides : header ) ;
128
- await Assert . ThrowsAsync < FirebaseException > (
133
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
129
134
async ( ) => await TokenVerifier . VerifyTokenAsync ( idToken ) ) ;
135
+
136
+ var expectedMessage = "Firebase ID token has incorrect algorithm."
137
+ + " Expected RS256 but got HS256." ;
138
+ this . CheckException ( exception , expectedMessage ) ;
130
139
}
131
140
132
141
[ Fact ]
@@ -138,11 +147,12 @@ public async Task Expired()
138
147
{ "exp" , expiryTime } ,
139
148
} ;
140
149
var idToken = await CreateTestTokenAsync ( payloadOverrides : payload ) ;
141
- var exception = await Assert . ThrowsAsync < FirebaseException > (
150
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
142
151
async ( ) => await TokenVerifier . VerifyTokenAsync ( idToken ) ) ;
152
+
143
153
var expectedMessage = $ "Firebase ID token expired at { expiryTime } . "
144
154
+ $ "Expected to be greater than { Clock . UnixTimestamp ( ) } .";
145
- Assert . Equal ( expectedMessage , exception . Message ) ;
155
+ this . CheckException ( exception , expectedMessage , AuthErrorCode . ExpiredIdToken ) ;
146
156
}
147
157
148
158
[ Fact ]
@@ -170,11 +180,11 @@ public async Task InvalidIssuedAt()
170
180
{ "iat" , issuedAt } ,
171
181
} ;
172
182
var idToken = await CreateTestTokenAsync ( payloadOverrides : payload ) ;
173
- var exception = await Assert . ThrowsAsync < FirebaseException > (
183
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
174
184
async ( ) => await TokenVerifier . VerifyTokenAsync ( idToken ) ) ;
175
- var expectedMessage = $ "Firebase ID token issued at future timestamp { issuedAt } . "
176
- + $ "Expected to be less than { Clock . UnixTimestamp ( ) } .";
177
- Assert . Equal ( expectedMessage , exception . Message ) ;
185
+
186
+ var expectedMessage = $ "Firebase ID token issued at future timestamp { issuedAt } .";
187
+ this . CheckException ( exception , expectedMessage ) ;
178
188
}
179
189
180
190
[ Fact ]
@@ -201,8 +211,11 @@ public async Task InvalidIssuer()
201
211
{ "iss" , "wrong-issuer" } ,
202
212
} ;
203
213
var idToken = await CreateTestTokenAsync ( payloadOverrides : payload ) ;
204
- await Assert . ThrowsAsync < FirebaseException > (
214
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
205
215
async ( ) => await TokenVerifier . VerifyTokenAsync ( idToken ) ) ;
216
+
217
+ var expectedMessage = "ID token has incorrect issuer (iss) claim." ;
218
+ this . CheckException ( exception , expectedMessage ) ;
206
219
}
207
220
208
221
[ Fact ]
@@ -213,8 +226,12 @@ public async Task InvalidAudience()
213
226
{ "aud" , "wrong-audience" } ,
214
227
} ;
215
228
var idToken = await CreateTestTokenAsync ( payloadOverrides : payload ) ;
216
- await Assert . ThrowsAsync < FirebaseException > (
229
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
217
230
async ( ) => await TokenVerifier . VerifyTokenAsync ( idToken ) ) ;
231
+
232
+ var expectedMessage = "ID token has incorrect audience (aud) claim."
233
+ + " Expected test-project but got wrong-audience" ;
234
+ this . CheckException ( exception , expectedMessage ) ;
218
235
}
219
236
220
237
[ Fact ]
@@ -225,8 +242,11 @@ public async Task EmptySubject()
225
242
{ "sub" , string . Empty } ,
226
243
} ;
227
244
var idToken = await CreateTestTokenAsync ( payloadOverrides : payload ) ;
228
- await Assert . ThrowsAsync < FirebaseException > (
245
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
229
246
async ( ) => await TokenVerifier . VerifyTokenAsync ( idToken ) ) ;
247
+
248
+ var expectedMessage = "Firebase ID token has no or empty subject (sub) claim." ;
249
+ this . CheckException ( exception , expectedMessage ) ;
230
250
}
231
251
232
252
[ Fact ]
@@ -237,8 +257,12 @@ public async Task LongSubject()
237
257
{ "sub" , new string ( 'a' , 129 ) } ,
238
258
} ;
239
259
var idToken = await CreateTestTokenAsync ( payloadOverrides : payload ) ;
240
- await Assert . ThrowsAsync < FirebaseException > (
260
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
241
261
async ( ) => await TokenVerifier . VerifyTokenAsync ( idToken ) ) ;
262
+
263
+ var expectedMessage = "Firebase ID token has a subject claim longer than"
264
+ + " 128 characters." ;
265
+ this . CheckException ( exception , expectedMessage ) ;
242
266
}
243
267
244
268
[ Fact ]
@@ -336,6 +360,18 @@ private static ISigner CreateTestSigner()
336
360
var serviceAccount = ( ServiceAccountCredential ) credential . UnderlyingCredential ;
337
361
return new ServiceAccountSigner ( serviceAccount ) ;
338
362
}
363
+
364
+ private void CheckException (
365
+ FirebaseAuthException exception ,
366
+ string prefix ,
367
+ AuthErrorCode errorCode = AuthErrorCode . InvalidIdToken )
368
+ {
369
+ Assert . Equal ( ErrorCode . InvalidArgument , exception . ErrorCode ) ;
370
+ Assert . StartsWith ( prefix , exception . Message ) ;
371
+ Assert . Equal ( errorCode , exception . AuthErrorCode ) ;
372
+ Assert . Null ( exception . InnerException ) ;
373
+ Assert . Null ( exception . HttpResponse ) ;
374
+ }
339
375
}
340
376
341
377
internal class FileSystemPublicKeySource : IPublicKeySource
0 commit comments