Hi,
I built a GAS that, after installation, exchanges the OAuth token of the effective user with my backend using ScriptApp.getOAuthToken().
This process automatically registers the user if they haven’t been registered yet (or updates their token if they have).
It worked well for me in development, but in production, when I call getOAuthToken(), the result is tied to gsmte...@marketplacetest.net with a different user ID, instead of the effective user.
Why is it happening? Does exchanging tokens from the GAS to your backend with getOAuthToken is a best practice ?
Esse comportamento ocorre porque quando um complemento do Google Workspace (como um Add-on publicado na Marketplace) é instalado e executado por um usuário, as chamadas ao ScriptApp.getOAuthToken() podem não refletir o usuário real (effective user), mas sim o usuário de serviço do ambiente de teste — como no caso citado, gsmte...@marketplacetest.net.
Ambiente de teste da Marketplace: Durante a publicação e testes de complementos na Marketplace, o ambiente utiliza uma conta de teste (marketplacetest.net), que pode interferir na identificação do usuário real ao chamar getOAuthToken().
Execução com escopo incorreto: Se o script estiver rodando como o usuário de instalação, e não como o usuário atual, o token obtido pode estar vinculado a essa identidade genérica.
Limitações de escopo ou do modelo de autorização: Alguns serviços (como ScriptApp.getOAuthToken()) podem retornar um token limitado que não é adequado para backend OAuth exchanges — especialmente se não forem incluídos os escopos apropriados no manifesto do complemento.
ScriptApp.getOAuthToken() para backends?Não. Não é recomendada a troca de tokens obtidos com getOAuthToken() diretamente com o backend em ambientes de produção. Isso por alguns motivos:
Segurança: Esses tokens são temporários e têm escopos limitados.
Validade: O backend precisa validar tokens e usá-los para identificar o usuário, o que nem sempre é confiável via Apps Script.
Desacoplamento: Um design robusto deve gerenciar autenticação e autorização via OAuth diretamente no backend, ou então usar uma conta de serviço para chamadas server-to-server.
Service Account (para chamadas sem usuário):
Use uma conta de serviço com delegação para operar com privilégios específicos no backend.
OAuth direto no Backend:
Realize o fluxo OAuth completo no seu backend (com consentimento do usuário via URL e callback) e armazene tokens de acesso/refresh ali.
Add-on com escopos corretos e Session.getActiveUser().getEmail():
Se for necessário identificar o usuário, use Session.getActiveUser().getEmail() (com escopo adequado e em domínio gerenciado).
O uso de getOAuthToken() em produção para backend não é uma prática recomendada.
O comportamento com marketplacetest.net é esperado em testes da Marketplace.
A melhor abordagem é fazer a autenticação completa no backend, ou utilizar service accounts para chamadas seguras e consistentes.
--
You received this message because you are subscribed to the Google Groups "Google Apps Script Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-apps-script-c...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/google-apps-script-community/ced24624-67d3-4fd8-b879-7a733575769fn%40googlegroups.com.