背景
我正在使用Google Apps脚本创建Gmail加载项。
通过此插件,我想使用REST服务请求连接到我的后端服务器(非Google服务)。该请求必须得到授权。获得授权后,我便可以向该服务器发出请求,以在数据库中接收与该用户关联的数据。我已经在Web应用程序中使用Google登录来登录后端服务-在前端,我在授权响应中的GoogleUser对象中收到id_token。
问题
通过Gmail插件连接到后端服务时,我需要此id_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令牌:
ScriptApp.getOAuthToken();
我假设令牌也可以存储在会话中。 Google Apps脚本API包含Session类,而其本身包含getActiveUser方法,该方法返回User对象。但是,User对象仅包含用户的电子邮件地址,不包含ID令牌(或与此有关的其他任何内容):
Session.getActiveUser().getEmail();
问题
有没有办法获取ID令牌?
我是否选择使用Gmail中已登录用户的数据登录后端服务器的正确方法?
答案 0 :(得分:1)
答案 1 :(得分:1)
getIdentityToken()
获取有效用户的OpenID Connect身份令牌:
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);
getOAuthToken()
从Apps Script的OAuth令牌获取Google ID令牌的步骤:
var firebaseConfig = {apiKey: YOUR_KEY, ...}
。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表示敬意