Skip to content

Commit cb09a09

Browse files
authored
feat: support session cookie sameSite options (#193)
1 parent f81d713 commit cb09a09

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

Diff for: Readme.md

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ const CONFIG = {
5959
signed: true, /** (boolean) signed or not (default true) */
6060
rolling: false, /** (boolean) Force a session identifier cookie to be set on every response. The expiration is reset to the original maxAge, resetting the expiration countdown. (default is false) */
6161
renew: false, /** (boolean) renew session when session is nearly expired, so we can always keep user logged in. (default is false)*/
62+
sameSite: '', /** (string) session cookie sameSite options (default '', don't set it) */
6263
};
6364

6465
app.use(session(CONFIG, app));

Diff for: index.js

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ function formatOpts(opts) {
6868
// defaults
6969
if (opts.overwrite == null) opts.overwrite = true;
7070
if (opts.httpOnly == null) opts.httpOnly = true;
71+
if (opts.sameSite == null) opts.sameSite = '';
7172
if (opts.signed == null) opts.signed = true;
7273
if (opts.autoCommit == null) opts.autoCommit = true;
7374

Diff for: test/cookie.test.js

+45
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ describe('Koa Session Cookie', () => {
9494
.expect(204, (err, res) => {
9595
if (err) return done(err);
9696
const cookie = res.headers['set-cookie'];
97+
// samesite is not set
98+
assert(!cookie.join(';').includes('samesite'));
9799
request(server)
98100
.get('/')
99101
.set('Cookie', cookie.join(';'))
@@ -244,6 +246,11 @@ describe('Koa Session Cookie', () => {
244246
.get('/')
245247
.set('Cookie', cookie)
246248
.expect('Set-Cookie', /koa:sess/)
249+
.expect(res => {
250+
const cookie = res.headers['set-cookie'];
251+
// samesite is not set
252+
assert(!cookie.join(';').includes('samesite'));
253+
})
247254
.expect(200, done);
248255
});
249256
});
@@ -694,6 +701,44 @@ describe('Koa Session Cookie', () => {
694701
});
695702
});
696703

704+
describe('options.sameSite', () => {
705+
it('should return opt.sameSite=none', done => {
706+
const app = App({ sameSite: 'none' });
707+
708+
app.use(async function(ctx) {
709+
ctx.session = { foo: 'bar' };
710+
ctx.body = ctx.session.foo;
711+
});
712+
713+
request(app.listen())
714+
.get('/')
715+
.expect(res => {
716+
const cookie = res.headers['set-cookie'].join('|');
717+
assert(cookie.includes('path=/; samesite=none; httponly'));
718+
})
719+
.expect('bar')
720+
.expect(200, done);
721+
});
722+
723+
it('should return opt.sameSite=lax', done => {
724+
const app = App({ sameSite: 'lax' });
725+
726+
app.use(async function(ctx) {
727+
ctx.session = { foo: 'bar' };
728+
ctx.body = ctx.session.foo;
729+
});
730+
731+
request(app.listen())
732+
.get('/')
733+
.expect(res => {
734+
const cookie = res.headers['set-cookie'].join('|');
735+
assert(cookie.includes('path=/; samesite=lax; httponly'));
736+
})
737+
.expect('bar')
738+
.expect(200, done);
739+
});
740+
});
741+
697742
describe('when valid and beforeSave set', () => {
698743
it('should ignore session when uid changed', done => {
699744
const app = new Koa();

0 commit comments

Comments
 (0)