Force refresh tokens if external app (#4461)

This commit is contained in:
Paulus Schoutsen 2020-01-13 05:47:08 -08:00 committed by GitHub
parent 5c32413bf7
commit 40ac456937
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 14 deletions

View File

@ -55,8 +55,12 @@ const connProm = async (auth) => {
throw err; throw err;
} }
// We can get invalid auth if auth tokens were stored that are no longer valid // We can get invalid auth if auth tokens were stored that are no longer valid
// Clear stored tokens. if (isExternal) {
if (!isExternal) { // Tell the external app to force refresh the access tokens.
// This should trigger their unauthorized handling.
await auth.refreshAccessToken(true);
} else {
// Clear stored tokens.
saveTokens(null); saveTokens(null);
} }
auth = await authProm(); auth = await authProm();

View File

@ -11,6 +11,10 @@ interface BasePayload {
callback: string; callback: string;
} }
interface GetExternalAuthPayload extends BasePayload {
force?: boolean;
}
interface RefreshTokenResponse { interface RefreshTokenResponse {
access_token: string; access_token: string;
expires_in: number; expires_in: number;
@ -26,7 +30,7 @@ declare global {
webkit?: { webkit?: {
messageHandlers: { messageHandlers: {
getExternalAuth: { getExternalAuth: {
postMessage(payload: BasePayload); postMessage(payload: GetExternalAuthPayload);
}; };
revokeExternalAuth: { revokeExternalAuth: {
postMessage(payload: BasePayload); postMessage(payload: BasePayload);
@ -60,8 +64,13 @@ class ExternalAuth extends Auth {
}); });
} }
public async refreshAccessToken() { public async refreshAccessToken(force?: boolean) {
const callbackPayload = { callback: CALLBACK_SET_TOKEN }; const payload: GetExternalAuthPayload = {
callback: CALLBACK_SET_TOKEN,
};
if (force) {
payload.force = true;
}
const callbackPromise = new Promise<RefreshTokenResponse>( const callbackPromise = new Promise<RefreshTokenResponse>(
(resolve, reject) => { (resolve, reject) => {
@ -73,11 +82,9 @@ class ExternalAuth extends Auth {
await 0; await 0;
if (window.externalApp) { if (window.externalApp) {
window.externalApp.getExternalAuth(JSON.stringify(callbackPayload)); window.externalApp.getExternalAuth(JSON.stringify(payload));
} else { } else {
window.webkit!.messageHandlers.getExternalAuth.postMessage( window.webkit!.messageHandlers.getExternalAuth.postMessage(payload);
callbackPayload
);
} }
const tokens = await callbackPromise; const tokens = await callbackPromise;
@ -87,7 +94,7 @@ class ExternalAuth extends Auth {
} }
public async revoke() { public async revoke() {
const callbackPayload = { callback: CALLBACK_REVOKE_TOKEN }; const payload: BasePayload = { callback: CALLBACK_REVOKE_TOKEN };
const callbackPromise = new Promise((resolve, reject) => { const callbackPromise = new Promise((resolve, reject) => {
window[CALLBACK_REVOKE_TOKEN] = (success, data) => window[CALLBACK_REVOKE_TOKEN] = (success, data) =>
@ -97,11 +104,9 @@ class ExternalAuth extends Auth {
await 0; await 0;
if (window.externalApp) { if (window.externalApp) {
window.externalApp.revokeExternalAuth(JSON.stringify(callbackPayload)); window.externalApp.revokeExternalAuth(JSON.stringify(payload));
} else { } else {
window.webkit!.messageHandlers.revokeExternalAuth.postMessage( window.webkit!.messageHandlers.revokeExternalAuth.postMessage(payload);
callbackPayload
);
} }
await callbackPromise; await callbackPromise;