Google Sheets API는 서버 키를 사용할 때 '발신자에게 권한이 없습니다'를 반환합니다.


89

API Manager에서 서버 키를 생성하고 Mac에서 다음을 실행하려고했습니다.

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

그러나 이것이 반환하는 것입니다.

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

내가 여기서 뭘 잘못하고 있니?


4
키는 공개 데이터에 액세스하기위한 것이며, 수행중인 작업에는 인증 된 액세스가 필요합니다.
DaImTo

대부분의 경우 범위에 문제가 있습니다. 스크립트에 필요한 범위를 확인하고 확인하십시오.
dpkrai96 '1910.09

답변:


119

이 문제를 해결하려면 다음을 시도하십시오.

  1. 서비스 계정 만들기 : https://console.developers.google.com/iam-admin/serviceaccounts/
  2. 옵션에서 키를 만듭니다.이 키는 일반적인 client_secret.json입니다. 동일한 방식으로 사용합니다.
  3. 서비스 계정의 역할 소유자를 만듭니다 (멤버 이름 = 서비스 계정 ID = 서비스 계정 이메일 예 : thomasapp@appname-201813.iam.gserviceaccount.com).
  4. 서비스 계정의 이메일 주소 = 서비스 계정 ID를 복사합니다.
  5. 브라우저에서 상호 작용하려는 Google 시트로 이동하십시오.
  6. 화면 오른쪽 상단의 공유로 이동합니다.
  7. 고급 설정으로 이동하여 서비스 계정의 이메일 주소 (예 : thomasapp@appname-201813.iam.gserviceaccount.com)와 공유합니다.

그것은 나를 위해 일했습니다 :)


1
이것은 나를 위해 일했습니다. 그건 그렇고 : Google 클라우드 관리자에서 ... 프로젝트> IAM 및 관리자> 서비스 계정 ....으로 이동하십시오. 서비스 계정을 설정 한 경우 각 서비스 계정에 대한 특별 이메일이 표시됩니다. Google Sheets API도 활성화했는지 확인하십시오. 말 그대로 Google 시트 "공유"버튼에서 서비스 계정 이메일 주소를 공유하기 만하면됩니다.
Jason F

1
예 ... 키 .... 바로 서비스 계정의 이메일과 문서를 공유하는 것입니다
user1102171

2
키 json은 Java 빠른 시작 가이드 (Sheets API 용)에서 얻은 자격 증명 json과 매우 다릅니다. 어떻게 구현합니까?
추기경

2
클라이언트 암호를 어떻게 사용합니까? 대신 서비스 계정으로 API 키를 만들 수 있나요?
Stephen Phillips

41

대답하기 조금 늦었지만 같은 문제로 어려움을 겪고있는 다른 사람들을 위해 나는 알고 있습니다.
그냥 대중에게 시트의 권한을 변경할 이 API 호출을 통해 인증없이 액세스 할 수 있도록 드라이브에.

액세스를 변경하려면 :

  1. Google 드라이브에서 시트 열기
  2. 오른쪽 상단에서 공유를 클릭합니다.
  3. 프롬프트 창 하단에서 고급을 클릭합니다.
  4. 공개 또는 링크가있는 사람에 대한 권한 변경 (로그인 필요 없음)

인증없이 시트에서 데이터를 가져 오는 API 요청을 보냅니다.

참고 : 시트에 민감한 데이터가 포함 된 경우 공개하는 것이 안전하지 않고 인증 된 액세스로 수행하는 것이 안전합니다.


35
또한이 시트를 특정 이메일 예와 공유 할 수 있습니다. 서비스 계정 (프로젝트) 이메일. "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", 스크립트로 시트에 액세스 할 수 있습니다.
Kishan Patel

4
감사합니다 형제. 당신이 언급 한 것과 같은 문서는 문서에 없습니다.
Maulik Dodia 2017

1
@MaulikDodia에 동의했습니다. Google API 문서에 여기 에 설명되어 있지만 API를 사용하여 공개 웹 사이트에 데이터를 표시하려는 사람들에게는 명확하지 않습니다. 이 모든 것에 대한 방법을 작성하는 중입니다. 완료되면 DM을 보내 드리겠습니다.
Edward

친구 @ user3411192 고마워요
Maulik Dodia

27

@KishanPatel의 의견에주의를 기울이십시오.

또한이 시트를 특정 이메일 예와 공유 할 수 있습니다. 서비스 계정 (프로젝트) 이메일. "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", 스크립트로 시트에 액세스 할 수 있습니다.


4

가장 쉬운 방법은 gcloud cli를 사용하여 수정하는 것입니다. 더 많은 문서는 여기 https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin

gcloud 설치

sudo apt-get install google-cloud-sdk

그런 다음 전화

gcloud init

그런 다음 활성 프로젝트 및 자격 증명을 확인하십시오.

gcloud config configurations list

정상이 아닌 경우 올바른 계정으로 인증되었는지 확인하십시오.

gcloud auth list
* account 1
  account 2

그렇지 않은 경우 프로젝트 계정으로 변경하십시오.

gcloud config set account `ACCOUNT`

계정에 따라 프로젝트 목록이 달라집니다.

gcloud projects list

- project 1
- project 2...

원하는 프로젝트로 전환 :

gcloud config set project `PROJECT NAME`

그런 다음을 사용하여 애플리케이션 기본 사용자 인증 정보를 생성 gcloud auth application-default login하면 google-cloud가 이러한 사용자 인증 정보를 자동으로 감지합니다.


0

My 10 cents ... 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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.