Изначально я создал надстройку Gmail в Apps Script:
function buildAddOn(e) {
var accessToken = e.messageMetadata.accessToken;
GmailApp.setCurrentMessageAccessToken(accessToken);
var messageId = e.messageMetadata.messageId;
var message = GmailApp.getMessageById(messageId);
...
}
Теперь я хочу перейти с AppScript на JavaScript (надстройка Gmail на другом языке ) и использовать Google API ( googleapis) для получения информации о метаданных сообщений и вложений:
import Hapi from "@hapi/hapi";
import { google } from "googleapis";
const port = 3023;
const init = async () => {
const server = Hapi.server({
port: port,
host: "localhost",
});
server.route({
method: "POST",
path: "/",
handler: async (request, h) => {
const { payload } = request;
const { gmail } = payload;
const gmailAPI = google.gmail({
version: "v1",
headers: {
// Here I want to use the access token coming from the Gmail add-on client
Authorization: `Bearer ${gmail.accessToken}`,
},
});
try {
// Here I want to get info about the current message is opened in Gmail while the add-on is active
const res = await gmailAPI.users.messages.get({
userId: "me",
id: gmail.messageId,
});
console.info(res.data);
} catch (e) {
console.info(e.response.data);
}
Это payload
из дополнительного клиента Gmail (веб-сайт Gmail):
{
commonEventObject: { hostApp: 'GMAIL', platform: 'WEB' },
gmail: {
messageId: 'msg-f:1762895788594548046',
threadId: 'thread-f:1762895788594548046',
accessToken: 'XXXYYYZZZ' // changing value for security
},
authorizationEventObject: {
userOAuthToken: 'GGGYYYJJJ', // changing value for security
systemIdToken: 'FFFHHHCCC' // changing value for security
}
}
Это ошибка:
{
error: {
code: 401,
message: 'Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
errors: [ [Object] ],
status: 'UNAUTHENTICATED'
}
}
Это области действия надстройки:
"oauthScopes": [
"https://www.googleapis.com/auth/gmail.addons.execute",
"https://mail.google.com/",
"https://www.googleapis.com/auth/gmail.metadata",
"https://www.googleapis.com/auth/gmail.readonly"
]
Вопрос: Как я могу успешно воспроизвести GmailApp.setCurrentMessageAccessToken(accessToken)
с помощью access_token
, поступающего от клиента Gmail, в серверную часть надстройки Gmail, чтобы я мог получить метаданные о текущей открытой почте
Чтобы создать службу Gmail API, вам нужно использовать OAuthToken, и вы можете использовать тот, который входит в полезную нагрузку, попробуйте эту модификацию:
const { payload } = request;
const { authorizationEventObject } = payload;
const gmailAPI = google.gmail({
version: "v1",
headers: {
// Here I want to use the access token coming from the Gmail add-on client
Authorization: `Bearer ${authorizationEventObject.userOAuthToken}`,
},
});
Пример есть в этой ссылке от Google Developers.