A API do Google Sheets retorna “O chamador não tem permissão” ao usar a chave do servidor

95

Eu gerei uma chave de servidor no API Manager e tentei executar o seguinte em meu Mac:

curl 'https://sheets.googleapis.com/v4/spreadsheets/MySheetID?ranges=A1:B5&key=TheServerKeyIGeneratedInAPIManager'

Mas é isso que ele retorna:

{
 "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}

O que eu estou fazendo errado aqui?

Instabrite
fonte
4
A chave é para acessar dados públicos, o que você está fazendo requer acesso autenticado.
DaImTo
Na maioria dos casos, há algum problema de escopos. Verifique e verifique quais escopos são exigidos pelo script.
dpkrai96

Respostas:

132

Para resolver esse problema, tente:

  1. Crie uma conta de serviço: https://console.developers.google.com/iam-admin/serviceaccounts/
  2. Em opções, crie uma chave: esta chave é o seu client_secret.json usual - use-a da mesma maneira
  3. Torne o proprietário da função para a conta de serviço (nome do membro = ID da conta de serviço = e-mail da conta de serviço ex: [email protected]
  4. Copie o endereço de e-mail da sua conta de serviço = ID da conta de serviço
  5. Basta ir em seu navegador para a planilha do Google com a qual deseja interagir
  6. Vá para COMPARTILHAR no canto superior direito da tela
  7. Vá para as configurações avançadas e compartilhe com o endereço de e-mail da sua conta de serviço, ex: [email protected]

Funcionou para mim :)

Thomas Beaudouin
fonte
1
isso funcionou para mim. a propósito: no google cloud admin vá para ... projeto> IAM & Admin> Contas de serviço .... Se você configurou contas de serviço, verá um e-mail especial para cada conta de serviço respectiva. Verifique se você também ativou a API do Planilhas Google. Literalmente, basta compartilhar o endereço de e-mail da conta de serviço no botão "compartilhar" da planilha do google.
Jason F
1
sim ... a chave é apenas compartilhar o documento com o e-mail da conta do serviço ....
user1102171
2
A chave json é muito diferente das credenciais json que obtive no guia de início rápido do Java (para a API Sheets). Como faço para implementá-lo?
Cardeal - Reintegrar Monica em
2
Como você usa o segredo do cliente? Você pode criar uma chave de API com uma conta de serviço?
Stephen Phillips
Muito obrigado. Isso deve ser incluído na documentação ou algo assim.
Abdul Malik
45

Eu sei que é um pouco tarde para responder, mas para outras pessoas que lutam com o mesmo problema.
Basta alterar a permissão da planilha para pública em sua unidade para que ela possa ser acessada sem autenticação por meio de chamadas de API.

Para alterar o acesso:

  1. Abrir página no Google Drive
  2. No canto superior direito, clique em compartilhar
  3. Na parte inferior da janela de prompt, clique em avançado
  4. Alterar permissão para público ou pessoas com link (não é necessário fazer login)

Envie uma solicitação de API para buscar dados de planilhas sem autenticação.

Observação: se a planilha contiver dados confidenciais, não é seguro torná-la pública e sim fazê-lo com acesso autenticado.

WLatif
fonte
37
Além disso, você pode compartilhar esta folha com e-mail específico. seu e-mail da conta de serviço (projeto). "client_email": "[email protected]", Isso permitirá o acesso à planilha pelo seu script.
Kishan Patel
4
Obrigado mano. Não há nada escrito na documentação do tipo que você mencionou.
Maulik Dodia
1
Concordado com @MaulikDodia. Os documentos da API do Google dizem isso aqui , mas não está claro para as pessoas que desejam apenas usar a API para exibir dados em um site público. Estou escrevendo um tutorial sobre tudo isso. Enviarei a você um DM quando terminar.
Edward
Muito obrigado amigo @ user3411192
Maulik Dodia
29

Certifique-se de prestar atenção ao comentário de @KishanPatel:

Além disso, você pode compartilhar esta folha com e-mail específico. seu e-mail da conta de serviço (projeto). "client_email": "[email protected]", Isso permitirá o acesso à planilha pelo seu script.

Horen
fonte
4

A maneira mais fácil é corrigir usando gcloud cli. Mais documentos aqui https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin

instalar gcloud

sudo apt-get install google-cloud-sdk

então ligue

gcloud init

em seguida, verifique seu projeto ativo e credenciais

gcloud config configurations list

Se não estiver ok, certifique-se de que você está autenticado com a conta correta:

gcloud auth list
* account 1
  account 2

Mude para a conta do projeto se não:

gcloud config set account `ACCOUNT`

Dependendo da conta, a lista de projetos será diferente:

gcloud projects list

- project 1
- project 2...

Mudar para o projeto pretendido:

gcloud config set project `PROJECT NAME`

Em seguida, Criar credenciais padrão do aplicativo com gcloud auth application-default logine, em seguida, google-cloud detectará automaticamente essas credenciais.

Yuliia Ashomok
fonte
0

Meus 10 centavos ... Um exemplo simples de ler a planilha usando Java .

    private Credential getCredentials() throws IOException {
            final InputStream accessKey = new ByteArrayInputStream("<credential json>");
            final GoogleCredential credential = GoogleCredential.fromStream(accessKey)
                    .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS_READONLY));
            return credential;
        }

    private HttpTransport httpTransport() {
            try {
                return GoogleNetHttpTransport.newTrustedTransport();
            } catch (GeneralSecurityException | IOException e) {
                throw new SpreadSheetServiceException(e);
            }
        }


    Sheets service = new Sheets.Builder(httpTransport(), JSON_FACTORY, getCredentials())
                    .setApplicationName("app-name")
                    .build();
            ValueRange response = service.spreadsheets().values()
                    .get("<spread_sheet_id>", "A1:A")
                    .execute();
Palma Dias
fonte