fix(embedded): Ensure guest token is passed to log endpoint (#20647)

* Pass guest token to sendBeacon

* Add tests
This commit is contained in:
Jack Fragassi 2022-07-08 15:17:01 -07:00 committed by GitHub
parent e1a918f141
commit dfab521f50
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 45 additions and 0 deletions

View File

@ -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),

View File

@ -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 },
) {

View File

@ -152,6 +152,7 @@ export interface SupersetClientInterface
| 'init'
| 'isAuthenticated'
| 'reAuthenticate'
| 'getGuestToken'
> {
configure: (config?: ClientConfig) => SupersetClientInterface;
reset: () => void;

View File

@ -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');
});
});

View File

@ -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({