PythonでGoogle Driveにアクセスしようとしたら「Insufficient Permission」やら「invalid_scope」が出て認証でコケた


PythonでGoogle Drive APIを使用してファイルをアップロードしたりしていたのだけど、久しぶりに使ったら認証でコケた。
それを解決したお話。

吐き出してたError Messageはこの2通りな感じ。

An error occurred: <HttpError 403 when requesting https://www.googleapis.com/upload/drive/v3/files?fields=id&alt=json&uploadType=multipart returned "Insufficient Permission: Request had insufficient authentication scopes.". Details: "[{'domain': 'global', 'reason': 'insufficientPermissions', 'message': 'Insufficient Permission: Request had insufficient authentication scopes.'}]">
google.auth.exceptions.RefreshError: ('invalid_scope: Bad Request', {'error': 'invalid_scope', 'error_description': 'Bad Request'})

解決策

ざっくり言うとGoogle cloud 設定画面で各種変更を行って、token.jsonを作り直した。

1. 既にあるtoken.jsonファイルを削除する。あるいはrenameして退避しておく。

2. Google cloud の設定ページへ行って各種設定変更。
https://console.cloud.google.com/apis/credentials/consent?project=【myProject】にアクセスして「OAuth 同意画面」画面で「アプリをテストモードにする」、「テストユーザーに自分のgoogleメールアドレスを追加」、「アプリを編集」画面で一つ目の画面を保存して進み、次の画面で「スコープを追加または削除」でGoogle Drive API系スコープ全部とService Management API系スコープを全部チェックをONにして保存する。

3. https://developers.google.com/drive/api/quickstart/pythonページの「python quickstart.py」をコピペして自環境で実行すると、googleログイン画面が立ち上がるので、全部にチェックをONにしてOKすると、勝手にtoken.jsonファイルが出来上がって完了
※quickstart.py内の「SCOPES」は、自分が使用したいものに変更する事。
(例:SCOPES = ['https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/drive.metadata'] )

Solved

1.delete local token.json

2.access Google cloud setting page.
https://console.cloud.google.com/apis/credentials/consent?project=【myProject】
On OAuth setting page, set "test mode" and "add test user" - my gmail account.
click "edit APP" button, On 2nd page, add All Google Drive API SCOPE and All Service Management API checkbox ON.

3.access https://developers.google.com/drive/api/quickstart/python
execute 「python quickstart.py」 on local.
On google login page, all checkbox ON.
New token.json file is auto create.
NOTE: Change the SCOPES according to your purpose.
ex: SCOPES = ['https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/drive.metadata']

*I'm sorry for my poor English explanation.

コメント

これで認証が通った。
Google cloudでの設定が必要になった様子。

アプリをテストモードにしないで本番モードにすると、スコープの承認に時間と費用がかかる(?)みたいなメッセージが出たので、テスト環境として実行することにした。
幸い、自分でテスト的に使用しているだけなので私の目的は達成したけれど、本番モードが必要な場合は異なった手続きが必要になるのかも知れない。(未検証・推測)