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

时间:2018-09-16 12:00:39

标签: google-app-maker

是否可以从App Maker的会话中获取“用户Google ID”。在文档中,它仅提到了如何检索已登录用户Session.getActiveUser().getEmail()的电子邮件,但没有在其中说明如何获取ID。我需要这样做,因为用户电子邮件有时可能会更改。因此,我需要用户ID来跟踪用户和相关的权限任务。还是我在这里缺少应该如何实现的东西。

3 个答案:

答案 0 :(得分:1)

一个团队成员已经解决了。这应该使用Apps脚本来完成-在服务器端脚本的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";不会被异步调用,因为它已经在服务器中发生了。

答案 1 :(得分:1)

但是,只需使用the Directory model即可更轻松地找到Google ID。尽管在文档中提到了可以获取当前登录的用户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,您可以安全地将不同的模型相互关联,而不必担心如果更改了已引用的用户电子邮件,数据库的完整性可能会受损。

只需通过创建一个充当Directory模型的包装器模型并将GoogleId存储在其中的模型,就可以完成不同模型的关联。然后将该模型链接到要跟踪用户相关数据的其他模型,因为很遗憾,我们无法将目录模型直接链接到其他模型。

答案 2 :(得分:0)

这是this question的重复吗?

我认为这可以解决您的问题,即使有点麻烦。