【问题标题】:Is it safe to have visible Google Drive API keys in Javascript?在 Javascript 中拥有可见的 Google Drive API 密钥是否安全?
【发布时间】:2021-04-05 15:39:38
【问题描述】:

我正在使用 Google Drive API 从 Google Drive 下载文件。我为此使用Javascript。在 JS 中拥有可见的 API 密钥是否安全,或者我应该使用 Node.js 或其他东西?正如您在代码顶部看到的,有很多键(开发者键、客户端 ID 和应用程序 ID)。我的代码中是否存在漏洞?

这是我的代码:

    var developerKey = '[key]';
    var clientId = "[key]"
    var appId = "[key]";
    var scope = ['https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/drive'];

    var pickerApiLoaded = false;
    var driveLoaded = false;
    var oauthToken;

    // Use the Google API Loader script to load the google.picker script.
    function loadPicker() {
      gapi.load('auth', {'callback': onAuthApiLoad});
      gapi.load('picker', {'callback': onPickerApiLoad});
      gapi.load('client', function () {
        gapi.client.load('drive', 'v2', function () {
          driveLoaded = true;
        });
    });
    }

    function onAuthApiLoad() {
      window.gapi.auth.authorize(
          {
            'client_id': clientId,
            'scope': scope,
            'immediate': false
          },
          handleAuthResult);
    }

    function onPickerApiLoad() {
      pickerApiLoaded = true;
      createPicker();
    }

    function handleAuthResult(authResult) {
      if (authResult && !authResult.error) {
        oauthToken = authResult.access_token;
        createPicker();
      }
    }

    // Create and render a Picker object for searching images.
    function createPicker() {
      if (pickerApiLoaded && oauthToken) {
        var view = new google.picker.View(google.picker.ViewId.DOCS);
        view.setMimeTypes("application/sla,application/vnd.ms-pki.stl,application/x-navistyle");
        var picker = new google.picker.PickerBuilder()
            .enableFeature(google.picker.Feature.NAV_HIDDEN)
            .enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
            .setAppId(appId)
            .setOAuthToken(oauthToken)
            .addView(view)
            .addView(new google.picker.DocsUploadView())
            .setDeveloperKey(developerKey)
            .setCallback(pickerCallback)
            .build();
         picker.setVisible(true);
      }
    }

  // A simple callback implementation.
  function pickerCallback(data) {
    if (data.action == google.picker.Action.PICKED) {
      var fileId = data.docs[0].id;
      downloadFile(fileId, data.docs[0].name);
    }
  }

  function downloadFile(fileId, fileName)
  {
    var request = gapi.client.drive.files.get({
      fileId:fileId,
      alt:"media"
    }).then(function(resp){
        $.post("PHP/save_file.php", {Type: "stl", Filename: fileName, Data: resp.body}, function(response) {
          if (response == "OK")
          {

          }
        });
    });
  }

  function showPickerDialog(){
    loadPicker()
  }

【问题讨论】:

  • 您可能需要查看help center 以查看您的问题是否与Information Security 的主题有关。
  • 是的,您不希望它们对客户端可用,甚至在您的代码存储库中。它们就像密码。
  • @RaniSharim 对于 javascript 客户端应用程序,它们并不像密码。服务器端的 Oauth2 更像是登录名和密码。客户端javascript更像是没有密码的登录。密码在链接到服务器上的 javascript 源时输入。与 Javascript 相关的客户端 ID 和 API 密钥仅向 Google 真正识别您的应用程序。
  • @HereticMonkey 我不确定这是否符合安全认证服务器客户端的最佳实践。

标签: javascript google-api


【解决方案1】:

当您在 Google Developer Console 上创建应用时,您创建了一个网络应用。创建它时,您添加了一个 javascript 源。只要您将此 javascript 源设置为运行应用程序的网络服务器的位置,那么任何人都无法使用您的客户端 ID。如果您将其设置为 localhost,那么是的,有人可能会劫持您的令牌并使用它。

至于 api 密钥,您应该将其锁定到特定域,但是 api 密钥只能让您访问读取公共数据。 Google Drive 中的公共数据量,但如果您不锁定它,有人可能会滥用您的 api 密钥。

【讨论】:

  • 谢谢。现在我使用 localhost 进行测试。将来我一定会设置域和其他东西......
  • 如果对你有帮助记得采纳答案
猜你喜欢
  • 2021-07-19
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
相关资源
最近更新 更多