問題点
PythonでGoogle APIのOAuth認証をやるの方法だと、認証用URLから認証・認可してリダイレクト先に戻ることでOAuth認証が完了する。しかし、デスクトップアプリケーションとしてGoogle APIを利用する設定にしていると、リダイレクト先はlocalhostとなる。Webサーバが起動していないと上記画像のようにERR_CONNECTION_REFUSED
が表示され認証が完了しない。VScodeの拡張機能であるLive Serverを入れてWebサーバを起動したりなど色々やったものの、認証処理が完了しなかった。
解決方法
PythonでGoogle APIのOAuth認証をやるの記事からの変更点は上記(左側が改善前、右側が改善後)。
flow.run_local_server(port=0)
の処理で認証用URLから認証・認可してリダイレクト先に戻ることでOAuth認証の完了まで実行されるがこれがうまくいかなかったため、認証用URL取得→トークンコードを取得して手動入力とすることで解決した。
修正した箇所の説明は下記。
- 4行目:redirect_uriの設定は必須
- これがないとauth_uri[0]で出力したURL先でMissing required parameter: redirect_uriという400: invalid_requestの認証エラーが発生する
- 6~9行目:flow.authorization_url()で認証用URLを取得して表示する
- 10行目:inputでトークンコードの入力待ちをする
- 11行目:入力されたコードをflow.fetch_tokenで受ける
- 12行目:クレデンシャルをcredsに格納する
実際の動きだと下記のようになる。上記はVSCodeのJupyterで動かしたときのキャプチャ。
- 処理を動かしてPlease visit~に表示されているURLにアクセスする
- 認証が完了すると最後は「正常に接続できませんでした」と表示される(ローカルでWebサーバがたっていればこの表示ではないはず)
- ただこのときURLにはパタメータとしてcodeが入っており、それをEnter the authorization codeと入力を促されているところにいれる
- http://localhost/から始まるURLでstateとcodeとscopeのパラメータがあり、codeに書いてある文字列を入力する
とするとpickleファイルの作成が成功する(6ヶ月以内であればこのpickleファイルを参照するので認証は必要なくなる)。
その他
- run_local_serverの代わりにrun_consoleを試したがうまくいかなかった。run_consoleは非推奨っぽい