Skip to content

Commit 72070dc

Browse files
jscyoRishabhrishabhpoddar
authored
feat(debugger): adds logger for debugging (#276)
* feat(debugger): adds logger for debugging * removes error message * Updates changelog * updates version information * fixs * adds additional comment * feedback changes * CHANGELOG.md updates * fixs * fixs * fixs * fixs * fixs * implements Rishabhs feedback * updates timestamp * updates comment example * updates base branch * fixs * fixs * fixs * updates to package lock * feat: Adds debug log messages (#285) * starts working on adding debug messages in the SDK * adds error log messages * adds more logs Co-authored-by: Rishabh <[email protected]> Co-authored-by: Rishabh <[email protected]> Co-authored-by: Rishabh Poddar <[email protected]>
1 parent f9818e7 commit 72070dc

20 files changed

+305
-8
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [unreleased]
99

10+
## [9.1.2] - 2022-04-01
11+
12+
### Added
13+
14+
- Adds debug logging functionality
1015
- removed jsonschema dependency
1116

1217
## [9.1.1] - 2022-03-24

lib/build/logger.d.ts

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/build/logger.js

Lines changed: 51 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/build/recipe/session/recipe.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ const querier_1 = require("../../querier");
5959
const implementation_1 = require("./api/implementation");
6060
const supertokens_js_override_1 = require("supertokens-js-override");
6161
const recipe_1 = require("../openid/recipe");
62+
const logger_1 = require("../../logger");
6263
// For Express
6364
class SessionRecipe extends recipeModule_1.default {
6465
constructor(recipeId, appInfo, isInServerlessEnv, config) {
@@ -108,10 +109,13 @@ class SessionRecipe extends recipeModule_1.default {
108109
__awaiter(this, void 0, void 0, function* () {
109110
if (err.fromRecipe === SessionRecipe.RECIPE_ID) {
110111
if (err.type === error_1.default.UNAUTHORISED) {
112+
logger_1.logDebugMessage("errorHandler: returning UNAUTHORISED");
111113
return yield this.config.errorHandlers.onUnauthorised(err.message, request, response);
112114
} else if (err.type === error_1.default.TRY_REFRESH_TOKEN) {
115+
logger_1.logDebugMessage("errorHandler: returning TRY_REFRESH_TOKEN");
113116
return yield this.config.errorHandlers.onTryRefreshToken(err.message, request, response);
114117
} else if (err.type === error_1.default.TOKEN_THEFT_DETECTED) {
118+
logger_1.logDebugMessage("errorHandler: returning TOKEN_THEFT_DETECTED");
115119
return yield this.config.errorHandlers.onTokenTheftDetected(
116120
err.payload.sessionHandle,
117121
err.payload.userId,
@@ -157,6 +161,14 @@ class SessionRecipe extends recipeModule_1.default {
157161
});
158162
});
159163
this.config = utils_1.validateAndNormaliseUserInput(this, appInfo, config);
164+
logger_1.logDebugMessage("session init: antiCsrf: " + this.config.antiCsrf);
165+
logger_1.logDebugMessage("session init: cookieDomain: " + this.config.cookieDomain);
166+
logger_1.logDebugMessage("session init: cookieSameSite: " + this.config.cookieSameSite);
167+
logger_1.logDebugMessage("session init: cookieSecure: " + this.config.cookieSecure);
168+
logger_1.logDebugMessage(
169+
"session init: refreshTokenPath: " + this.config.refreshTokenPath.getAsStringDangerous()
170+
);
171+
logger_1.logDebugMessage("session init: sessionExpiredStatusCode: " + this.config.sessionExpiredStatusCode);
160172
this.isInServerlessEnv = isInServerlessEnv;
161173
if (this.config.jwt.enable === true) {
162174
this.openIdRecipe = new recipe_1.default(recipeId, appInfo, isInServerlessEnv, {

lib/build/recipe/session/recipeImplementation.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const processState_1 = require("../../processState");
4141
const normalisedURLPath_1 = require("../../normalisedURLPath");
4242
const supertokens_1 = require("../../supertokens");
4343
const framework_1 = require("../../framework");
44+
const logger_1 = require("../../logger");
4445
class HandshakeInfo {
4546
constructor(
4647
antiCsrf,
@@ -138,6 +139,7 @@ function getRecipeInterface(querier, config) {
138139
},
139140
getSession: function ({ req, res, options }) {
140141
return __awaiter(this, void 0, void 0, function* () {
142+
logger_1.logDebugMessage("getSession: Started");
141143
if (!res.wrapperUsed) {
142144
res = framework_1.default[supertokens_1.default.getInstanceOrThrowError().framework].wrapResponse(
143145
res
@@ -148,16 +150,24 @@ function getRecipeInterface(querier, config) {
148150
req
149151
);
150152
}
153+
logger_1.logDebugMessage("getSession: rid in header: " + utils_2.frontendHasInterceptor(req));
154+
logger_1.logDebugMessage("getSession: request method: " + req.getMethod());
151155
let doAntiCsrfCheck = options !== undefined ? options.antiCsrfCheck : undefined;
152156
let idRefreshToken = cookieAndHeaders_1.getIdRefreshTokenFromCookie(req);
153157
if (idRefreshToken === undefined) {
154158
// we do not clear cookies here because of a
155159
// race condition mentioned here: https://github.com/supertokens/supertokens-node/issues/17
156160
if (options !== undefined && typeof options !== "boolean" && options.sessionRequired === false) {
161+
logger_1.logDebugMessage(
162+
"getSession: returning undefined because idRefreshToken is undefined and sessionRequired is false"
163+
);
157164
// there is no session that exists here, and the user wants session verification
158165
// to be optional. So we return undefined.
159166
return undefined;
160167
}
168+
logger_1.logDebugMessage(
169+
"getSession: UNAUTHORISED because idRefreshToken from cookies is undefined"
170+
);
161171
throw new error_1.default({
162172
message:
163173
"Session does not exist. Are you sending the session tokens in the request as cookies?",
@@ -179,6 +189,9 @@ function getRecipeInterface(querier, config) {
179189
utils_2.frontendHasInterceptor(req) ||
180190
utils_2.normaliseHttpMethod(req.getMethod()) === "get"
181191
) {
192+
logger_1.logDebugMessage(
193+
"getSession: Returning try refresh token because access token from cookies is undefined"
194+
);
182195
throw new error_1.default({
183196
message: "Access token has expired. Please call the refresh API",
184197
type: error_1.default.TRY_REFRESH_TOKEN,
@@ -191,6 +204,7 @@ function getRecipeInterface(querier, config) {
191204
if (doAntiCsrfCheck === undefined) {
192205
doAntiCsrfCheck = utils_2.normaliseHttpMethod(req.getMethod()) !== "get";
193206
}
207+
logger_1.logDebugMessage("getSession: Value of doAntiCsrfCheck is: " + doAntiCsrfCheck);
194208
let response = yield SessionFunctions.getSession(
195209
helpers,
196210
accessToken,
@@ -213,6 +227,7 @@ function getRecipeInterface(querier, config) {
213227
);
214228
accessToken = response.accessToken.token;
215229
}
230+
logger_1.logDebugMessage("getSession: Success!");
216231
return new sessionClass_1.default(
217232
helpers,
218233
accessToken,
@@ -223,6 +238,7 @@ function getRecipeInterface(querier, config) {
223238
);
224239
} catch (err) {
225240
if (err.type === error_1.default.UNAUTHORISED) {
241+
logger_1.logDebugMessage("getSession: Clearing cookies because of UNAUTHORISED response");
226242
cookieAndHeaders_1.clearSessionFromCookie(config, res);
227243
}
228244
throw err;
@@ -236,6 +252,7 @@ function getRecipeInterface(querier, config) {
236252
},
237253
refreshSession: function ({ req, res }) {
238254
return __awaiter(this, void 0, void 0, function* () {
255+
logger_1.logDebugMessage("refreshSession: Started");
239256
if (!res.wrapperUsed) {
240257
res = framework_1.default[supertokens_1.default.getInstanceOrThrowError().framework].wrapResponse(
241258
res
@@ -248,6 +265,9 @@ function getRecipeInterface(querier, config) {
248265
}
249266
let inputIdRefreshToken = cookieAndHeaders_1.getIdRefreshTokenFromCookie(req);
250267
if (inputIdRefreshToken === undefined) {
268+
logger_1.logDebugMessage(
269+
"refreshSession: UNAUTHORISED because idRefreshToken from cookies is undefined"
270+
);
251271
// we do not clear cookies here because of a
252272
// race condition mentioned here: https://github.com/supertokens/supertokens-node/issues/17
253273
throw new error_1.default({
@@ -259,6 +279,9 @@ function getRecipeInterface(querier, config) {
259279
try {
260280
let inputRefreshToken = cookieAndHeaders_1.getRefreshTokenFromCookie(req);
261281
if (inputRefreshToken === undefined) {
282+
logger_1.logDebugMessage(
283+
"refreshSession: UNAUTHORISED because refresh token from cookies is undefined"
284+
);
262285
throw new error_1.default({
263286
message:
264287
"Refresh token not found. Are you sending the refresh token in the request as a cookie?",
@@ -273,6 +296,7 @@ function getRecipeInterface(querier, config) {
273296
cookieAndHeaders_1.getRidFromHeader(req) !== undefined
274297
);
275298
utils_1.attachCreateOrRefreshSessionResponseToExpressRes(config, res, response);
299+
logger_1.logDebugMessage("refreshSession: Success!");
276300
return new sessionClass_1.default(
277301
helpers,
278302
response.accessToken.token,
@@ -286,6 +310,9 @@ function getRecipeInterface(querier, config) {
286310
(err.type === error_1.default.UNAUTHORISED && err.payload.clearCookies) ||
287311
err.type === error_1.default.TOKEN_THEFT_DETECTED
288312
) {
313+
logger_1.logDebugMessage(
314+
"refreshSession: Clearing cookies because of UNAUTHORISED or TOKEN_THEFT_DETECTED response"
315+
);
289316
cookieAndHeaders_1.clearSessionFromCookie(config, res);
290317
}
291318
throw err;

lib/build/recipe/session/sessionFunctions.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const error_1 = require("./error");
5151
const processState_1 = require("../../processState");
5252
const normalisedURLPath_1 = require("../../normalisedURLPath");
5353
const utils_1 = require("../../utils");
54+
const logger_1 = require("../../logger");
5455
/**
5556
* @description call this to "login" a user.
5657
*/
@@ -172,12 +173,18 @@ function getSession(helpers, accessToken, antiCsrfToken, doAntiCsrfCheck, contai
172173
if (accessTokenInfo !== undefined) {
173174
if (antiCsrfToken === undefined || antiCsrfToken !== accessTokenInfo.antiCsrfToken) {
174175
if (antiCsrfToken === undefined) {
176+
logger_1.logDebugMessage(
177+
"getSession: Returning TRY_REFRESH_TOKEN because antiCsrfToken is missing from request"
178+
);
175179
throw new error_1.default({
176180
message:
177181
"Provided antiCsrfToken is undefined. If you do not want anti-csrf check for this API, please set doAntiCsrfCheck to false for this API",
178182
type: error_1.default.TRY_REFRESH_TOKEN,
179183
});
180184
} else {
185+
logger_1.logDebugMessage(
186+
"getSession: Returning TRY_REFRESH_TOKEN because the passed antiCsrfToken is not the same as in the access token"
187+
);
181188
throw new error_1.default({
182189
message: "anti-csrf check failed",
183190
type: error_1.default.TRY_REFRESH_TOKEN,
@@ -187,6 +194,9 @@ function getSession(helpers, accessToken, antiCsrfToken, doAntiCsrfCheck, contai
187194
}
188195
} else if (handShakeInfo.antiCsrf === "VIA_CUSTOM_HEADER") {
189196
if (!containsCustomHeader) {
197+
logger_1.logDebugMessage(
198+
"getSession: Returning TRY_REFRESH_TOKEN because custom header (rid) was not passed"
199+
);
190200
throw new error_1.default({
191201
message:
192202
"anti-csrf check failed. Please pass 'rid: \"session\"' header in the request, or set doAntiCsrfCheck to false for this API",
@@ -231,6 +241,7 @@ function getSession(helpers, accessToken, antiCsrfToken, doAntiCsrfCheck, contai
231241
delete response.jwtSigningPublicKeyList;
232242
return response;
233243
} else if (response.status === "UNAUTHORISED") {
244+
logger_1.logDebugMessage("getSession: Returning UNAUTHORISED because of core response");
234245
throw new error_1.default({
235246
message: response.message,
236247
type: error_1.default.UNAUTHORISED,
@@ -250,6 +261,7 @@ function getSession(helpers, accessToken, antiCsrfToken, doAntiCsrfCheck, contai
250261
// we force update the signing keys...
251262
yield helpers.getHandshakeInfo(true);
252263
}
264+
logger_1.logDebugMessage("getSession: Returning TRY_REFRESH_TOKEN because of core response");
253265
throw new error_1.default({
254266
message: response.message,
255267
type: error_1.default.TRY_REFRESH_TOKEN,
@@ -301,6 +313,9 @@ function refreshSession(helpers, refreshToken, antiCsrfToken, containsCustomHead
301313
};
302314
if (handShakeInfo.antiCsrf === "VIA_CUSTOM_HEADER") {
303315
if (!containsCustomHeader) {
316+
logger_1.logDebugMessage(
317+
"refreshSession: Returning TRY_REFRESH_TOKEN because custom header (rid) was not passed"
318+
);
304319
throw new error_1.default({
305320
message: "anti-csrf check failed. Please pass 'rid: \"session\"' header in the request.",
306321
type: error_1.default.UNAUTHORISED,
@@ -318,11 +333,13 @@ function refreshSession(helpers, refreshToken, antiCsrfToken, containsCustomHead
318333
delete response.status;
319334
return response;
320335
} else if (response.status === "UNAUTHORISED") {
336+
logger_1.logDebugMessage("refreshSession: Returning UNAUTHORISED because of core response");
321337
throw new error_1.default({
322338
message: response.message,
323339
type: error_1.default.UNAUTHORISED,
324340
});
325341
} else {
342+
logger_1.logDebugMessage("refreshSession: Returning TOKEN_THEFT_DETECTED because of core response");
326343
throw new error_1.default({
327344
message: "Token theft detected",
328345
payload: {

0 commit comments

Comments
 (0)