質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

3301閲覧

Google APIのサービスアカウントキーによるOauth認証が出来ない

ikki

総合スコア17

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

2クリップ

投稿2019/06/04 16:02

編集2019/06/06 23:56

前提・実現したいこと

Google Cloud Functions でメールの自動返信BOTを作ろうと思い以下のコードを実行しましたが、Oauth認証でbad request error が返って来ます。
クライアントIDによる認証(run_flowでcodeを手入力しました)は出来たのですが サービスアカウントキーを使用する認証ができませんでした。
*当質問はG suiteサービス未利用でもGmail API にサービスキーでアクセスができるだろうという、私の誤解が前提で書かれています。ご回答いただきまして、前提自体が誤りであることがわかりました

環境

  • WindowsのAtomで実行(Scriptパッケージで実行してます…)
  • 下記コードのエラー結果は上記ローカル環境によるものです
  • クラウドサービスの動作テストは全てGoogle Cloud Platform の同一プロジェクト内で行っています

- Gsuiteサービスは利用しておりません。 個人利用アカウントで実行しています

ファイル構成
-main.py
-requirements.txt
-project.json

試したこと

  • クライアントID認証コードでcloud Functions にデプロイして途中まで動作したことを確認しました

(jasonトークンを上書き出来ませんと言われました)

  • サービスアカウントキーをcloud storage に保存するプログラムをcloud Functionsデプロイしてサービスアカウントキーが保存できることを確認しました

  • キー発行アカウントにAPI管理者とAPI閲覧者の権限を付けました

(同一アカウントにストレージ管理者の権限も与えcloud storage の認証も受けています)

コード

main.py

python

1os.environ["GOOGLE_APPLICATION_CREDENTIALS"]='project.json' 2 3from google.oauth2 import service_account 4import googleapiclient.discovery 5 6 7def run_m(): 8 SCOPES = ['https://www.googleapis.com/auth/gmail.readonly', 9 'https://www.googleapis.com/auth/gmail.compose', 10 'https://www.googleapis.com/auth/gmail.labels'] 11 json_file = 'project.json' 12 credentials = service_account.Credentials.from_service_account_file(json_file, scopes=SCOPES) 13 delegated_credentials = credentials.with_subject('"****t@******.com"') 14 service = googleapiclient.discovery.build('gmail', 'v1', credentials=credentials) 15 request = {'labelIds': ['Label_4501394728387839841'], 16 #'labelFilterAction' : "include", 17 'topicName': 'mytopic'} 18 res = service.users().watch(userId='me', body=request).execute()

project.json

project.json

1{ 2 "type": "service_account", 3 "project_id": "project", 4 "private_key_id": "******************", 5 "private_key": "-----BEGIN PRIVATE KEY-----********\n-----END PRIVATE KEY-----\n", 6 "client_email": "****t@******.com", 7 "client_id": "***********", 8 "auth_uri": "https://accounts.google.com/o/oauth2/auth", 9 "token_uri": "https://oauth2.googleapis.com/token", 10 "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", 11 "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/account%40project.iam.gserviceaccount.com" 12} 13

エラー

Traceback (most recent call last):
File "C:\Users\user\deploy\main.py", line 38, in <module>
run_m()
File "C:\Users\user\deploy\main.py", line 31, in run_m
res = service.users().watch(userId='me', body=request).execute()
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\googleapiclient_helpers.py", line 130, in positional_wrapper
return wrapped(*args, **kwargs)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\googleapiclient\http.py", line 851, in execute
raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/watch?alt=json returned "Bad Request">
[Finished in 5.113s]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YasuhiroNiji

2019/06/05 14:28 編集

Gmail側の設定が必要だと思われます。G Suite 全体を対象にしたいということで回答しています。
ikki

2019/06/06 00:46

YasuhiroNiji様 早速のご回答ありがとうございます。説明不足で申し訳ありません。 こちらは一般アカウントでG Suiteサービスを利用しておりません。 当方の理解度不足で申し訳ないのですが、ドキュメント内容を『サービス利用者以外は権限委任操作は不要』と解釈しておりました。 Gmail API にサービスキーでアクセスするにはG suite利用必須、ということなのでしょうか? 上記を踏まえ『G Suite 全体を対象にしたい』というご要望にどう対応させて頂ければよいか、誘導いただけると助かります。 よろしくお願いいたします。
YasuhiroNiji

2019/06/06 04:07

Gmail API にサービスキーでアクセスするにはG suite 利用必須です。
guest

回答1

0

ベストアンサー

Google アカウントの Gmail の場合や G suite の場合でも特定のメールアドレスだけであれば、クライアントIDによる認証で、アプリパスワードを使うとトークンを保存する必要がなくなるので、今回の質問のケースでも対応できます。「安全性の低いアプリのアクセス」を許可することでも対応できるのですが、アプリパスワードを使った方がセキュリティ面ではベターです。

アプリパスワードを使うためには、まず、Google アカウントの「セキュリティ」のページで、2段階認証プロセスをオンにします。「アプリ パスワード」の項目が表示されるので、そこから生成できます。

イメージ説明

Google cloud のサービスキーを使用する場合は、G Suite が必須になり。概ね以下の作業が必要になると思います。

  1. Google Cloud のサービスアカウントの設定で、「G Suite 全体の委任を有効にする」にチェックを入れる。

  2. G Suite の「管理」の「セキュリティ」の「API クライアント アクセスを管理する」という画面で、クライアントID と 必要な API スコープを登録する。

公式マニュアル

公式マニュアルは、わかりにくいので、次のページも参考にするといいと思います。
qiita: サービスアカウントで認証してGMail APIでメール送信(Java)

投稿2019/06/05 14:17

編集2019/06/06 04:44
YasuhiroNiji

総合スコア584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikki

2019/06/06 00:57

YasuhiroNiji様 早速のご回答、ありがとうございます。 説明不足で申し訳ありません。こちらは一般アカウントでG Suiteサービスを利用しておりません。 G suite 利用が必須であれば、そもそも質問が的外れでしたね。。。。。 クライアントIDによる認証を使いたいのですが、Cloud unctions のデプロイされたディレクトリは追記ができないようで、tokenの書き出しが厄介でした。 やはりクライアントIDを使用して都度Cloud Storage 等に書き出す方法が一番いいのでしょうか?
ikki

2019/06/06 01:15

YasuhiroNiji様 『クライアントIDによる認証で、アプリパスワードを使った方法』 確認してみます! ご提案、ありがとうございます。
YasuhiroNiji

2019/06/06 04:46

回答の方を修正しておきました。
ikki

2019/06/06 07:37

YasuhiroNiji様 ご回答、確認させて頂きました。 素人の質問にご丁寧に誘導頂き、大変感謝申し上げます。 頂いた回答にて当方の疑問はすべて解消し、実現したいことも実現できますので、YasuhiroNiji様の回答をベストアンサーにさせて頂きます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問