google-apps-script - 在Gmail加载项中获取ID token 以进行后端服务身份验证

标签 google-apps-script google-api google-oauth google-openid gmail-addons

背景
我正在使用Google Apps脚本创建Gmail加载项。
通过此插件,我想使用REST服务请求连接到我的后端服务器(非Google服务)。该请求必须得到授权。获得授权后,我便可以向该服务器发出请求,以在数据库中接收与该用户关联的数据。我已经在我的Web应用程序中使用Google登录来登录后端服务-在前端,我在授权响​​应中的GoogleUser对象中收到id_token。

问题
通过Gmail插件连接到后端服务时,我需要此id_token登录。但是,我找不到方法来访问 token 。

研究
我认为 token 必须通过Apps脚本中的API可用。
在网络应用中,我使用Google Auth API收到了id_token,如下所示:

Promise.resolve(this.auth2.signIn())
        .then((googleUser) => {
            let user_token = googleUser.getAuthResponse().id_token; // this is the id_token I need in the Gmail plugin, too

            // send the id_token to the backend service
            ...
        };

在Google Apps脚本API中,我只能找到OAuth token :
ScriptApp.getOAuthToken();

我假设 token 也可以存储在 session 中。 Google Apps脚本API包含Session类,并且其本身包含getActiveUser方法,该方法返回User对象。但是,User对象仅包含用户的电子邮件地址,不包含ID token (或与此相关的其他任何内容):
Session.getActiveUser().getEmail();

问题
有没有办法获取ID token ?
我是否选择使用Gmail中已登录用户的数据登录后端服务器的正确方法?

最佳答案

方法1:使用 getIdentityToken()

获取有效用户的OpenID Connect身份 token :

var idToken = ScriptApp.getIdentityToken();
var body = idToken.split('.')[1];
var decoded = Utilities.newBlob(Utilities.base64Decode(body)).getDataAsString();
var payload = JSON.parse(decoded);
var profileId = payload.sub;
Logger.log('Profile ID: ' + profileId);

方法2:使用Firebase和 getOAuthToken()

从Apps Script的OAuth token 获取Google ID token 的步骤:
  • 为您的Apps脚本项目启用Identity Toolkit API。
  • 将新的Firebase项目添加到您现有的Google Cloud Platform项目中,网址为https://console.firebase.google.com/
  • 为平台:Web创建Firebase应用程序。
  • 您将获得配置数据:var firebaseConfig = {apiKey: YOUR_KEY, ...}
  • https://console.firebase.google.com/project/PROJECT_ID/authentication/providers上为您的Firebase项目启用Google登录方法。
  • 使用Apps脚本功能获取当前用户的ID token :

  • function getGoogleIDToken()
    {
        // get your configuration from Firebase web app's settings
        var firebaseConfig = {
            apiKey: "***",
            authDomain: "*.firebaseapp.com",
            databaseURL: "https://*.firebaseio.com",
            projectId: "***",
            storageBucket: "***.appspot.com",
            messagingSenderId: "*****",
            appId: "***:web:***"
        };
    
        var res = UrlFetchApp.fetch('https://identitytoolkit.googleapis.com/v1/accounts:signInWithIdp?key='+firebaseConfig.apiKey, {
            method: 'POST',
            payload: JSON.stringify({
                requestUri: 'https://'+firebaseConfig.authDomain,
                postBody: 'access_token='+ScriptApp.getOAuthToken()+'&providerId=google.com',
                returnSecureToken: true,
                returnIdpCredential: true
            }),
            contentType: 'application/json',
            muteHttpExceptions: true
        });
    
        var responseData = JSON.parse(res);
    
        idToken = responseData.idToken;
    
        Logger.log('Google ID Token: ');
        Logger.log(idToken);
    
        return idToken;
    }
    

    恭喜Riël Notermans

    关于google-apps-script - 在Gmail加载项中获取ID token 以进行后端服务身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52387866/

    相关文章:

    javascript - 使用 GDrive 脚本仅显示一次对话框(实现脏位系统)

    c# - 如何在 c# 中使用 google apis 将邮件设置为 gmail 的 'Important'?

    google-api - 如何避免 Gmail API 集成的安全评估

    reactjs - 从google oauth2 web客户端requestAccessToken函数获取c.trim错误

    javascript - 使用 auth 2.0 从 Chrome 扩展程序发送邮件,但卡在我不知道的地方

    google-chrome-extension - 带有 oauth 的 Google chrome 扩展

    javascript - Google Apps Script V8 运行时使用哪个版本的 ECMAScript?

    javascript - 如何允许用户写入电子表格而不共享正在写入的文件

    arrays - 如何在 Google Sheet 的 App Script 中创建数组的真正新副本?

    android - 如何使用 Google API 构建 Android 源代码?