Google APIのOAuth認証がうまくいかなくて解決した話

プログラミング
この記事は約3分で読めます。
PythonでGoogle APIのOAuth認証をやるの記事を作ったときにredirect_urisについて色々ハマったはずだが書いておらず、かつ今回全然解決できなかったので別の方法でOAuth認証をした。

問題点

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は非推奨っぽい

参考サイト

タイトルとURLをコピーしました