サーバーキーを使用すると、Google SheetsAPIは「発信者に権限がありません」を返します


95

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 2016

ほとんどの場合、スコープに問題があります。スクリプトで必要なスコープを確認してください。
dpkrai 9619年

回答:


131

この問題を解決するには、次のことを試してください。

  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
これは私のために働いた。ちなみに、グーグルクラウド管理で...プロジェクト> IAMと管理>サービスアカウント...に移動します。サービスアカウントを設定している場合は、それぞれのサービスアカウントごとに特別なメールが表示されます。Google SheetsAPIも有効にしていることを確認してください。文字通り、あなたはグーグルシートの「共有」ボタンからサービスアカウントのメールアドレスを共有するだけです。
ジェイソン

1
はい...キーは....ちょうどサービスアカウントの電子メールで文書を共有することです
user1102171

2
キーjsonは、Javaクイックスタートガイド(Sheets API用)から取得した資格情報jsonとは大きく異なります。どうすれば実装できますか?
枢機卿-モニカを復活させる

2
クライアントシークレットをどのように使用しますか?代わりにサービスアカウントでAPIキーを作成できますか?
スティーブンフィリップス

どうもありがとうございます。これは、ドキュメントなどに含める必要があります。
AbdulMalik20年

45

答えるのが少し遅いことは知っていますが、同じ問題に苦しんでいる他の人々にとっては。ドライブでシートの権限をパブリック変更する
だけで、 API呼び出しによる認証なしでシートにアクセスできます。

アクセスを変更するには:

  1. Googleドライブでシートを開く
  2. 右上の[共有]をクリックします
  3. プロンプトウィンドウの下部で、[詳細]をクリックします
  4. パブリックまたはリンクのある人への許可の変更(サインインは不要)

認証なしでシートからデータをフェッチするAPIリクエストを送信します。

注:シートに機密データが含まれている場合、それを公開することは安全ではなく、認証されたアクセスで行うことは安全ではありません。


37
また、このシートを特定のメールExと共有することもできます。サービスアカウント(プロジェクト)の電子メール。"client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com"、これにより、スクリプトでシートにアクセスできるようになります。
Kishan Patel 2017

4
ありがとう兄貴。あなたが言及したような文書には書かれたものはありません。
Maulik Dodia 2017年

1
@MaulikDodiaに同意しました。Google APIのドキュメントにはここで記載されていますが、APIを使用して公開ウェブサイトにデータを表示したいだけの人にとっては明確ではありません。私はこれらすべてについてハウツーを書いている最中です。終わったらDMを送ります。
エドワード

どうもありがとうfriend @ user3411192
Maulik Dodia 2018年

29

@KishanPatelのコメントに注意を払うようにしてください:

また、このシートを特定のメールExと共有することもできます。サービスアカウント(プロジェクト)の電子メール。"client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com"、これにより、スクリプトでシートにアクセスできるようになります。


4

最も簡単な方法は、gcloudcliを使用して修正することです。その他のドキュメントはこちら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

私の10セント... 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.