TrackJS和GDPR和SPA

时间:2019-10-08 06:00:54

标签: security data-security trackjs

我在SPA中使用TrackJS,我具有与GDPR相关的逻辑,因此在给予同意之前我无法发送任何数据。

我找到了onError配置选项,可以帮助您解决此问题。 但是我仍然需要外部{@ {1}}的请求。我可以通过一些技巧来禁用它,但是它看起来不正确。

那么如何防止使用电话?

实施示例:

https://usage.trackjs.com/usage.gif

我还发现SPA中的使用情况调用存在问题。它不会显示实际的页面浏览结果。因此,最好有手动调用使用情况请求的支持,它将解决上述两个问题。 发现它的已知限制:https://docs.trackjs.com/data-management/pageviews/

2 个答案:

答案 0 :(得分:2)

此处的TrackJS front end error monitoring中的Todd。我不认为您需要缩短GDPR使用情况的调用,因为它不包含任何用户特定的数据。它只是一个给定应用程序已加载多少次的计数器。

用法仅发送:

  • 帐户令牌
  • 我想要的应用程序
  • 生成的唯一性标识符

这些都不追溯到用户,因此您应该能够继续进行并允许使用调用发生,并使用您描述的方法来阻止错误在onError中发送。

或者,我建议您将通话推迟到TrackJS.install,直到获得同意为止。这种方法的缺点是未捕获在同意之前发生的错误。但是我想这就是用户想要的吗?

答案 1 :(得分:1)

目前,我只找到一种解决方法。 我编写了辅助类,该类应用了猴子补丁,以防止在允许之前发送使用情况调用和错误跟踪。通常,当您需要阻止加载外部脚本时(例如,我们已经使用过的iubenda。

Helper类:

class TrackJSUtil {
  static URL_PATTERN = /usage\.trackjs\.com/;

  /**
   * Keep usage url
   *
   * @private
   * @type {null|string}
   */
  usageUrl = null;

  /**
   * Is requests allowed
   *
   * @private
   * @type {boolean}
   */
  isRequestsAllowed = false;

  /**
   * Apply monkey patch
   */
  install() {
    if (this.isRequestsAllowed) {
      return;
    }

    const setUsageUrl = (value) => {
      this.usageUrl = value;
    };

    const ignore = () => this.isRequestsAllowed || this.usageUrl != null;

    const createElementOriginal = document.createElement.bind(document);

    document.createElement = function createElementForTrackJS(...args) {
      const element = createElementOriginal(...args);

      if (ignore() || element.tagName.toUpperCase() !== 'IMG') {
        return element;
      }

      Object.defineProperty(element, 'src', {
        get() {
          return this.getAttribute('src');
        },
        set(value) {
          if (TrackJSUtil.URL_PATTERN.test(value)) {
            setUsageUrl(value);
          } else {
            this.setAttribute('src', value);
          }
        },
      });

      return element;
    };
  }

  /**
   * Callback for onError in TrackJS
   * @return {boolean}
   */
  onTrackJSError() {
    return this.isRequestsAllowed;
  }

  /**
   * Call it when requests are allowed
   */
  allow() {
    if (this.isRequestsAllowed) {
      return;
    }

    this.isRequestsAllowed = true;

    if (this.usageUrl == null) {
      return;
    }

    document.createElement('img').src = this.usageUrl;
  }
}

用法:

import { TrackJS } from 'trackjs';

const util = new TrackJSUtil();

if (IS_CONSENT_GIVEN) {
  util.allow()
} else {
  callItWhenConsentGiven(() => {
    util.allow();
  });
}

util.install();

TrackJS.install({
  onError: () => util.onTrackJSError(),
});