【问题标题】:How to get Google UserId from active user session in App Maker?如何从 App Maker 中的活动用户会话中获取 Google UserId?
【发布时间】:2018-09-16 12:00:39
【问题描述】:

有没有办法从应用制作工具的会话中获取“用户 Google ID”。在文档中,它只提到了如何检索登录用户Session.getActiveUser().getEmail() 的电子邮件,但没有说明如何获取 ID。我需要这个,因为用户电子邮件有时可能会发生变化。所以我需要用户 id 来跟踪用户和相关的权限任务。或者我在这里应该如何实现它时遗漏了什么。

【问题讨论】:

    标签: google-app-maker


    【解决方案1】:

    使用the Directory model 是一种更简单的查找 Google Id 的方法。虽然它在文档中提到有一种方法可以获取当前登录的用户 ID(即 Google ID),但它没有明确说明如何 - 也许可以在此处改进文档。另一个问题是,在许多情况下,当前活动用户的电子邮件被称为 id,例如在不推荐使用的方法 Session.getActiveUser().getUserLoginId() 中。无论如何,这是获取 id 的正确方法。

    var query = app.models.Directory.newQuery();
    query.filters.PrimaryEmail._equals = Session.getActiveUser().getEmail();
    var result = query.run();
    var GoogleId = result[0]._key;
    

    因此,使用此 GoogleId,您可以安全地将不同的模型相互关联,而不必担心如果已引用的用户电子邮件发生更改,数据库完整性可能会中断。

    只需创建一个模型作为目录模型的包装模型并将 GoogleId 存储在其中,就可以简单地关联不同的模型。然后将该模型链接到您想要跟踪用户相关数据的其他模型,因为不幸的是我们无法直接将目录模型链接到其他模型。

    【讨论】:

      【解决方案2】:

      一位团队成员已经弄清楚了。这应该使用 Apps Script 来完成 - 它使用服务器端脚本在 App Maker 环境中工作。

      var GoogleUser = (function (){
      
          /**
           * 
           * @param {string} email
           */
          function getUserObjByEmail(email){
      
              // Same as using AdminDirectory class.
              var apiUrl = "https://www.googleapis.com/admin/directory/v1/users/"+email+"?fields=id";
              var token = ScriptApp.getOAuthToken();
              var header = {"Authorization":"Bearer " + token};
              var options = {
                  "method": "GET",
                  "headers": header
              };
      
              var response = JSON.parse(UrlFetchApp.fetch(apiUrl, options));
              return response;
          }
      
      
          /**
           * 
           * @param {string} email - User email.
           */
          function getIdByEmail(email){
              return getUserObjByEmail(email)['id'];
          }
      
          var publicApi = {
              getIdByEmail: getIdByEmail
          };
      
          return publicApi;
      })();
      

      请注意,使用 var apiUrl = "https://www.googleapis.com/admin/directory/v1/users/"+email+"?fields=id"; 不会被异步调用,因为它已经在服务器中发生。

      【讨论】:

        【解决方案3】:

        这是this question的重复吗?

        我认为这会解决你的问题,即使它有点小技巧。

        【讨论】:

        • 感谢您提及该帖子,但它已过时。我已经发布了更新的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        相关资源
        最近更新 更多