1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-19 00:15:43 +01:00

chore: add a bunch of logs to validate api token validation behavior (#6905)

This change is meant to test something in sandbox. It will be reverted
after the investigation.
This commit is contained in:
Gastón Fournier 2024-04-23 11:14:54 +02:00 committed by GitHub
parent d59f1adfe5
commit dec107a597
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 24 additions and 0 deletions

View File

@ -78,6 +78,9 @@ const apiAccessMiddleware = (
// If we're here, we know that api token middleware was enabled, otherwise we'd returned a no-op middleware // If we're here, we know that api token middleware was enabled, otherwise we'd returned a no-op middleware
// We explicitly only protect client and proxy apis, since admin apis are protected by our permission checker // We explicitly only protect client and proxy apis, since admin apis are protected by our permission checker
// Reject with 401 // Reject with 401
logger.warn(
`Client api request without valid token (${apiToken}), rejecting`,
);
res.status(401).send({ res.status(401).send({
message: NO_TOKEN_WHERE_TOKEN_WAS_REQUIRED, message: NO_TOKEN_WHERE_TOKEN_WAS_REQUIRED,
}); });

View File

@ -108,6 +108,9 @@ export class ApiTokenService {
async fetchActiveTokens(): Promise<void> { async fetchActiveTokens(): Promise<void> {
try { try {
this.activeTokens = await this.store.getAllActive(); this.activeTokens = await this.store.getAllActive();
this.logger.info(
`Fetched active tokens from store, size: ${this.activeTokens.length}`,
);
} catch (e) { } catch (e) {
this.logger.warn('Failed to fetch active tokens', e); this.logger.warn('Failed to fetch active tokens', e);
} }
@ -122,6 +125,9 @@ export class ApiTokenService {
return undefined; return undefined;
} }
this.logger.info(
`Checking for token in cache of size: ${this.activeTokens.length}`,
);
let token = this.activeTokens.find( let token = this.activeTokens.find(
(activeToken) => (activeToken) =>
Boolean(activeToken.secret) && Boolean(activeToken.secret) &&
@ -139,13 +145,27 @@ export class ApiTokenService {
} }
const nextAllowedQuery = this.queryAfter.get(secret) ?? 0; const nextAllowedQuery = this.queryAfter.get(secret) ?? 0;
this.logger.info(
`Token found in cache: ${Boolean(
token,
)}, next allowed query: ${nextAllowedQuery}`,
);
if (!token && isPast(nextAllowedQuery)) { if (!token && isPast(nextAllowedQuery)) {
this.logger.info(
`Token not found in cache, querying database for token with secret: ${secret}`,
);
if (this.queryAfter.size > 1000) { if (this.queryAfter.size > 1000) {
// establish a max limit for queryAfter size to prevent memory leak // establish a max limit for queryAfter size to prevent memory leak
this.logger.info(
'queryAfter size exceeded 1000, clearing cache',
);
this.queryAfter.clear(); this.queryAfter.clear();
} }
// prevent querying the same invalid secret multiple times. Expire after 5 minutes // prevent querying the same invalid secret multiple times. Expire after 5 minutes
this.queryAfter.set(secret, addMinutes(new Date(), 5)); this.queryAfter.set(secret, addMinutes(new Date(), 5));
this.logger.info(
`Added ${secret} to queryAfter: ${this.queryAfter.get(secret)}`,
);
const stopCacheTimer = this.timer('getTokenWithCache.query'); const stopCacheTimer = this.timer('getTokenWithCache.query');
token = await this.store.get(secret); token = await this.store.get(secret);
@ -193,6 +213,7 @@ export class ApiTokenService {
secret: string, secret: string,
): Promise<IApiUser | undefined> { ): Promise<IApiUser | undefined> {
const token = await this.getTokenWithCache(secret); const token = await this.getTokenWithCache(secret);
this.logger.info(`getUserForToken ${secret} found: ${token}`);
if (token) { if (token) {
this.lastSeenSecrets.add(token.secret); this.lastSeenSecrets.add(token.secret);
const apiUser: IApiUser = new ApiUser({ const apiUser: IApiUser = new ApiUser({