【发布时间】:2018-09-16 12:00:39
【问题描述】:
有没有办法从应用制作工具的会话中获取“用户 Google ID”。在文档中,它只提到了如何检索登录用户Session.getActiveUser().getEmail() 的电子邮件,但没有说明如何获取 ID。我需要这个,因为用户电子邮件有时可能会发生变化。所以我需要用户 id 来跟踪用户和相关的权限任务。或者我在这里应该如何实现它时遗漏了什么。
【问题讨论】:
标签: google-app-maker
有没有办法从应用制作工具的会话中获取“用户 Google ID”。在文档中,它只提到了如何检索登录用户Session.getActiveUser().getEmail() 的电子邮件,但没有说明如何获取 ID。我需要这个,因为用户电子邮件有时可能会发生变化。所以我需要用户 id 来跟踪用户和相关的权限任务。或者我在这里应该如何实现它时遗漏了什么。
【问题讨论】:
标签: google-app-maker
使用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 存储在其中,就可以简单地关联不同的模型。然后将该模型链接到您想要跟踪用户相关数据的其他模型,因为不幸的是我们无法直接将目录模型链接到其他模型。
【讨论】:
一位团队成员已经弄清楚了。这应该使用 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"; 不会被异步调用,因为它已经在服务器中发生。
【讨论】:
这是this question的重复吗?
我认为这会解决你的问题,即使它有点小技巧。
【讨论】: