This is an automated email from the ASF dual-hosted git repository.
lilykuang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new dfab521f50 fix(embedded): Ensure guest token is passed to log endpoint
(#20647)
dfab521f50 is described below
commit dfab521f50593b97fc778475498920552cad15dc
Author: Jack Fragassi <[email protected]>
AuthorDate: Fri Jul 8 15:17:01 2022 -0700
fix(embedded): Ensure guest token is passed to log endpoint (#20647)
* Pass guest token to sendBeacon
* Add tests
---
.../src/connection/SupersetClient.ts | 1 +
.../src/connection/SupersetClientClass.ts | 4 +++
.../superset-ui-core/src/connection/types.ts | 1 +
superset-frontend/src/middleware/logger.test.js | 35 ++++++++++++++++++++++
.../src/middleware/loggerMiddleware.js | 4 +++
5 files changed, 45 insertions(+)
diff --git
a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts
b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts
index 530c710809..f102cd197d 100644
---
a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts
+++
b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts
@@ -44,6 +44,7 @@ const SupersetClient: SupersetClientInterface = {
get: request => getInstance().get(request),
init: force => getInstance().init(force),
isAuthenticated: () => getInstance().isAuthenticated(),
+ getGuestToken: () => getInstance().getGuestToken(),
post: request => getInstance().post(request),
postForm: (...args) => getInstance().postForm(...args),
put: request => getInstance().put(request),
diff --git
a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts
b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts
index b7281d0259..fd040faed0 100644
---
a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts
+++
b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts
@@ -158,6 +158,10 @@ export default class SupersetClientClass {
return this.csrfToken !== null && this.csrfToken !== undefined;
}
+ getGuestToken() {
+ return this.guestToken;
+ }
+
async get<T extends ParseMethod = 'json'>(
requestConfig: RequestConfig & { parseMethod?: T },
) {
diff --git
a/superset-frontend/packages/superset-ui-core/src/connection/types.ts
b/superset-frontend/packages/superset-ui-core/src/connection/types.ts
index 0602595675..80b40da030 100644
--- a/superset-frontend/packages/superset-ui-core/src/connection/types.ts
+++ b/superset-frontend/packages/superset-ui-core/src/connection/types.ts
@@ -152,6 +152,7 @@ export interface SupersetClientInterface
| 'init'
| 'isAuthenticated'
| 'reAuthenticate'
+ | 'getGuestToken'
> {
configure: (config?: ClientConfig) => SupersetClientInterface;
reset: () => void;
diff --git a/superset-frontend/src/middleware/logger.test.js
b/superset-frontend/src/middleware/logger.test.js
index fd584c2b36..d67c681caa 100644
--- a/superset-frontend/src/middleware/logger.test.js
+++ b/superset-frontend/src/middleware/logger.test.js
@@ -109,4 +109,39 @@ describe('logger middleware', () => {
SupersetClient.post.getCall(0).args[0].postPayload.events,
).toHaveLength(3);
});
+
+ it('should use navigator.sendBeacon if it exists', () => {
+ const clock = sinon.useFakeTimers();
+ const beaconMock = jest.fn();
+ Object.defineProperty(navigator, 'sendBeacon', {
+ writable: true,
+ value: beaconMock,
+ });
+
+ logger(mockStore)(next)(action);
+ expect(beaconMock.mock.calls.length).toBe(0);
+ clock.tick(2000);
+
+ expect(beaconMock.mock.calls.length).toBe(1);
+ const endpoint = beaconMock.mock.calls[0][0];
+ expect(endpoint).toMatch('/superset/log/');
+ });
+
+ it('should pass a guest token to sendBeacon if present', () => {
+ const clock = sinon.useFakeTimers();
+ const beaconMock = jest.fn();
+ Object.defineProperty(navigator, 'sendBeacon', {
+ writable: true,
+ value: beaconMock,
+ });
+ SupersetClient.configure({ guestToken: 'token' });
+
+ logger(mockStore)(next)(action);
+ expect(beaconMock.mock.calls.length).toBe(0);
+ clock.tick(2000);
+ expect(beaconMock.mock.calls.length).toBe(1);
+
+ const formData = beaconMock.mock.calls[0][1];
+ expect(formData.getAll('guest_token')[0]).toMatch('token');
+ });
});
diff --git a/superset-frontend/src/middleware/loggerMiddleware.js
b/superset-frontend/src/middleware/loggerMiddleware.js
index b88d555428..14df9af778 100644
--- a/superset-frontend/src/middleware/loggerMiddleware.js
+++ b/superset-frontend/src/middleware/loggerMiddleware.js
@@ -44,6 +44,10 @@ const sendBeacon = events => {
if (navigator.sendBeacon) {
const formData = new FormData();
formData.append('events', safeStringify(events));
+ if (SupersetClient.getGuestToken()) {
+ // if we have a guest token, we need to send it for auth via the form
+ formData.append('guest_token', SupersetClient.getGuestToken());
+ }
navigator.sendBeacon(endpoint, formData);
} else {
SupersetClient.post({