diff --git a/site/src/backend/auth.js b/site/src/backend/auth.js
index 7792f4ee37..3878328765 100644
--- a/site/src/backend/auth.js
+++ b/site/src/backend/auth.js
@@ -2,7 +2,7 @@ import polka from 'polka';
import devalue from 'devalue';
import send from '@polka/send';
import { get, post } from 'httpie';
-import { parse, stringify } from 'querystring';
+import { parse, stringify, unescape, escape } from 'querystring';
import { decode, sign, verify } from './token';
import { find, query } from '../utils/db';
@@ -25,13 +25,28 @@ function onError(err, req, res) {
res.headersSent || send(res, code, { error });
}
+function cookies(req) {
+ if (!req.headers.hasOwnProperty("cookie")) {
+ return {};
+ }
+ return req.headers.cookie.split("; ").map((cookie) => {
+ const index = cookie.indexOf("=");
+ return [cookie.substring(0, index), cookie.substring(index+1)];
+ }).reduce((agg, [key, value]) => {
+ agg[unescape(key)] = unescape(value);
+ return agg;
+ }, {});
+}
+
/**
* Middleware to determine User validity
*/
export async function isUser(req, res) {
const abort = exit.bind(null, res, 401);
- const auth = req.headers.authorization;
+ const jwt_token = cookies(req).jwt_token
+
+ const auth = req.headers.authorization || (jwt_token && `Bearer ${jwt_token}`);
if (!auth) return abort('Missing Authorization header');
const [scheme, token] = auth.split(' ');
@@ -112,14 +127,16 @@ export function API() {
returning *
`, [id, name, login, avatar_url, access_token]);
+ const user_props = toUser(user);
send(res, 200, `
`, {
- 'Content-Type': 'text/html; charset=utf-8'
+ 'Content-Type': 'text/html; charset=utf-8',
+ 'Set-Cookie': `jwt_token=${escape(user_props.token)}; path=/; MaxAge=${30 * 24 * 60 * 60}; HttpOnly`
});
} catch (err) {
console.error('GET /auth/callback', err);
@@ -129,6 +146,12 @@ export function API() {
});
}
});
+
+ app.delete('/logout', async (req, res) => {
+ send(res, 204, ``, {
+ 'Set-Cookie': `jwt_token=; MaxAge=0; HttpOnly`
+ });
+ });
} else {
// Print "Misconfigured" error
app.get('/auth/login', (req, res) => {
diff --git a/site/src/routes/repl/[id]/_components/AppControls/UserMenu.svelte b/site/src/routes/repl/[id]/_components/AppControls/UserMenu.svelte
index 245ea70eae..1404c1d5fc 100644
--- a/site/src/routes/repl/[id]/_components/AppControls/UserMenu.svelte
+++ b/site/src/routes/repl/[id]/_components/AppControls/UserMenu.svelte
@@ -1,8 +1,6 @@