شما میتوانید از متد ScriptApp.getIdentityToken() برای دریافت یک توکن هویت OpenID Connect (یک JSON Web Token یا JWT) برای کاربر فعال استفاده کنید. میتوانید از این توکن برای احراز هویت با سرویسهای Google Cloud مانند Cloud Run که برای پذیرش آن پیکربندی شدهاند، استفاده کنید.
فعال کردن دامنه openid
دامنه openid برای تولید توکن شناسه OpenID Connect مورد نیاز است. همچنین باید سایر دامنههایی که اسکریپت شما از آنها استفاده میکند، مانند https://www.googleapis.com/auth/script.external_request برای سرویس UrlFetch را فهرست کنید. دامنه https://www.googleapis.com/auth/userinfo.email در این مثال برای افزودن آدرس ایمیل کاربر به توکن هویت گنجانده شده است.
در فایل مانیفست پروژه اسکریپت خود ( appsscript.json )، دامنه openid و هر دامنه مورد نیاز دیگر را به آرایه oauthScopes اضافه کنید:
{
"timeZone": "America/New_York",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"openid",
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/userinfo.email"
]
}
پیکربندی سرویس ابری گوگل
شما باید سرویس Google Cloud را طوری پیکربندی کنید که توکن هویتی صادر شده به اسکریپت شما را بپذیرد. این کار معمولاً شامل اضافه کردن شناسه کلاینت اسکریپت به عنوان مخاطب مجاز است.
برای یافتن شناسه کلاینت اسکریپت خود، میتوانید یک توکن هویت را رمزگشایی کنید:
function logClientId() {
const idToken = ScriptApp.getIdentityToken();
const body = idToken.split('.')[1];
const decoded = Utilities.newBlob(Utilities.base64Decode(body)).getDataAsString();
const payload = JSON.parse(decoded);
Logger.log('Client ID: ' + payload.aud);
}
برای Cloud Run، میتوانید مخاطبان سفارشی را طوری پیکربندی کنید که به این شناسه کلاینت اجازه دسترسی بدهند.
درخواست احراز هویت شده را ثبت کنید
پس از پیکربندی، میتوانید توکن هویت را در هدر Authorization درخواستهای خود قرار دهید:
function callCloudRunService() {
const idToken = ScriptApp.getIdentityToken();
const url = 'https://your-service-url.a.run.app';
const response = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + idToken
}
});
Logger.log(response.getContentText());
}