如何从 App Maker 中的活动用户会话中获取 Google UserId?

How to get Google UserId from active user session in App Maker?

有没有办法从 App Maker 的会话中获取 "User Google Id"。在文档中,它只提到了如何检索登录用户 Session.getActiveUser().getEmail() 的电子邮件,但没有提到如何获取 ID。我需要这个,因为用户电子邮件有时可能会更改。所以我需要用户 ID 来跟踪用户和相关权限任务。或者我在这里遗漏了一些应该如何实施的东西。

这是 this question 的翻版吗?

我认为这会解决您的问题,尽管它有点乱七八糟。

一位团队成员已经弄明白了。这应该使用 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"; 不会被异步调用,因为它已经发生在服务器中。

还有一个更简单的方法来查找 Google ID,只需使用 the Directory model。尽管它在文档中提到有一种方法可以获取当前登录的用户 ID(即 Google Id),但它没有明确说明如何 - 也许可以在此处改进文档。另一个问题是,在许多情况下,当前活动用户的电子邮件在不推荐使用的方法 Session.getActiveUser().getUserLoginId() 中被称为 id。无论如何,这是获取 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。然后 link将该模型连接到您想要跟踪用户相关数据的其他模型,因为不幸的是我们不能直接 link 将目录模型连接到其他模型。