Skip to content

Commit 6def917

Browse files
committed
fix: token validation
1 parent 42355aa commit 6def917

File tree

2 files changed

+35
-21
lines changed

2 files changed

+35
-21
lines changed

src/background/index.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
getFollowedStreams,
1515
request,
1616
revoke,
17+
validate,
1718
} from "./modules/twitch";
1819

1920
setupSentry();
@@ -24,12 +25,10 @@ async function refresh(withNotifications: boolean) {
2425
});
2526

2627
if (navigator.onLine) {
27-
const accessToken = await stores.accessToken.get();
28-
2928
let currentUser: HelixUser | null = null;
3029
let followedStreams = new Array<HelixStream>();
3130

32-
if (accessToken) {
31+
if (await validate()) {
3332
currentUser = await getCurrentUser();
3433

3534
if (currentUser) {

src/background/modules/twitch.ts

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { camelCase, castArray, chunk, find, flatMap, get, snakeCase, toString } from "lodash-es";
1+
import { camelCase, castArray, chunk, find, get, snakeCase, toString } from "lodash-es";
22

33
import { allPromises, changeCase, matchString, openUrl, t } from "~/common/helpers";
44
import { stores } from "~/common/stores";
@@ -11,7 +11,7 @@ class RequestError extends Error {
1111
readonly request: Request,
1212
readonly response: Response,
1313
) {
14-
super(response.statusText);
14+
super(`Request failed with status code ${response.status}: ${request.method} ${request.url}`);
1515

1616
if (Error.captureStackTrace) {
1717
Error.captureStackTrace(this, RequestError);
@@ -36,7 +36,9 @@ export async function request<T>(
3636
}
3737

3838
const request = new Request(url, {
39-
headers: [["Client-ID", process.env.TWITCH_CLIENT_ID]],
39+
headers: {
40+
"Client-ID": process.env.TWITCH_CLIENT_ID,
41+
},
4042
});
4143

4244
const accessToken = await stores.accessToken.get();
@@ -47,20 +49,8 @@ export async function request<T>(
4749

4850
const response = await fetch(request);
4951

50-
switch (response.status) {
51-
case 204:
52-
return undefined as never;
53-
54-
case 401: {
55-
stores.accessToken.set(null);
56-
57-
createNotification("authorize", {
58-
title: t("notificationTitle_accessExpired"),
59-
message: t("notificationMessage_accessExpired"),
60-
});
61-
62-
break;
63-
}
52+
if (response.status === 204) {
53+
return undefined as never;
6454
}
6555

6656
if (response.ok) {
@@ -89,7 +79,7 @@ export async function getUsersByIds(userIds: string[]) {
8979
get(await request<HelixUser>("users", { id }), "data"),
9080
);
9181

92-
return flatMap(pages);
82+
return pages.flat();
9383
}
9484

9585
export async function getFollowedStreams(userId: string) {
@@ -112,6 +102,31 @@ export async function authorize() {
112102
return openUrl(url.href, undefined, true);
113103
}
114104

105+
export async function validate() {
106+
const accessToken = await stores.accessToken.get();
107+
108+
if (accessToken) {
109+
const response = await fetch("https://id.twitch.tv/oauth2/validate", {
110+
headers: {
111+
Authorization: `Bearer ${accessToken}`,
112+
},
113+
});
114+
115+
if (response.status === 401) {
116+
createNotification("authorize", {
117+
title: t("notificationTitle_accessExpired"),
118+
message: t("notificationMessage_accessExpired"),
119+
});
120+
121+
stores.accessToken.set(null);
122+
}
123+
124+
return response.ok;
125+
}
126+
127+
return false;
128+
}
129+
115130
export async function revoke() {
116131
const token = await stores.accessToken.get();
117132

0 commit comments

Comments
 (0)