Skip to content

Commit 39ebb66

Browse files
committed
feat: allow configurable expiration for refreshToken
1 parent 4db1f21 commit 39ebb66

File tree

3 files changed

+81
-7
lines changed

3 files changed

+81
-7
lines changed

.changeset/sad-worms-dream.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@labdigital/federated-token": minor
3+
---
4+
5+
Pass refreshToken.expiresIn option to setRefreshToken

packages/core/src/tokensource/cookies-base.test.ts

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,7 @@ describe("CookieTokenSource", () => {
235235
]);
236236
});
237237

238-
// Test for setting the refresh token for authenticated users
239-
it("should set the refresh token for authenticated users", () => {
238+
it("should set the refresh token with default Expires for authenticated users", () => {
240239
const request: Request = new Request("http://localhost");
241240
const response: Response = new Response();
242241

@@ -248,18 +247,82 @@ describe("CookieTokenSource", () => {
248247

249248
cookieTokenSource.setRefreshToken(request, response, "FOOBAR", true);
250249

250+
const expectedExpires = new Date(Date.now() + 60 * 60 * 24 * 365 * 1000);
251+
252+
const cookies = getCookies(response);
253+
expect(cookies).toEqual([
254+
{
255+
refreshToken: "FOOBAR",
256+
Path: "/refresh",
257+
SameSite: "None",
258+
Expires: expectedExpires.toUTCString(),
259+
},
260+
{
261+
userRefreshTokenExists: "1",
262+
SameSite: "None",
263+
Expires: expectedExpires.toUTCString(),
264+
},
265+
]);
266+
});
267+
268+
it("should set the refresh token with custom Expires for authenticated users", () => {
269+
const request: Request = new Request("http://localhost");
270+
const response: Response = new Response();
271+
272+
const cookieTokenSource = new TestCookieTokenSource({
273+
secure: true,
274+
sameSite: "none",
275+
refreshTokenPath: "/refresh",
276+
refreshToken: {
277+
expiresIn: 60,
278+
},
279+
});
280+
281+
const expectedExpires = new Date(Date.now() + 60 * 1000);
282+
283+
cookieTokenSource.setRefreshToken(request, response, "FOOBAR", true);
284+
285+
const cookies = getCookies(response);
286+
expect(cookies).toEqual([
287+
{
288+
refreshToken: "FOOBAR",
289+
Path: "/refresh",
290+
SameSite: "None",
291+
Expires: expectedExpires.toUTCString(),
292+
},
293+
{
294+
userRefreshTokenExists: "1",
295+
SameSite: "None",
296+
Expires: expectedExpires.toUTCString(),
297+
},
298+
]);
299+
});
300+
301+
it("should set the refresh token with session Expires for authenticated users", () => {
302+
const request: Request = new Request("http://localhost");
303+
const response: Response = new Response();
304+
305+
const cookieTokenSource = new TestCookieTokenSource({
306+
secure: true,
307+
sameSite: "none",
308+
refreshTokenPath: "/refresh",
309+
refreshToken: {
310+
expiresIn: "session",
311+
},
312+
});
313+
314+
cookieTokenSource.setRefreshToken(request, response, "FOOBAR", true);
315+
251316
const cookies = getCookies(response);
252317
expect(cookies).toEqual([
253318
{
254319
refreshToken: "FOOBAR",
255320
Path: "/refresh",
256321
SameSite: "None",
257-
Expires: expect.any(String),
258322
},
259323
{
260324
userRefreshTokenExists: "1",
261325
SameSite: "None",
262-
Expires: expect.any(String),
263326
},
264327
]);
265328
});

packages/core/src/tokensource/cookies-base.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,12 +285,18 @@ export abstract class BaseCookieTokenSource<TRequest, TResponse>
285285
token: string,
286286
isAuthenticated = false,
287287
) {
288-
const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 365);
289-
const cookieOptions = {
288+
const opts = this.options.refreshToken ?? {
289+
expiresIn: 60 * 60 * 24 * 365, // Default expiration is one year
290+
};
291+
292+
const cookieOptions: CookieOptions = {
290293
httpOnly: false,
291294
secure: this.options.secure,
292295
sameSite: this.options.sameSite,
293-
expires: expiresAt,
296+
expires:
297+
opts.expiresIn === "session"
298+
? undefined
299+
: new Date(Date.now() + opts.expiresIn * 1000),
294300
domain: this.adapter.getPublicDomain(request),
295301
};
296302

0 commit comments

Comments
 (0)