見出し画像

GoogleAPI OAuth認証解説

GoogleAPIを仕事で使ったので、その認証方式の一つOAUth認証について書きます。

巷にはいくつか書かれていますが、もう少しマジのガチの初心者向けに書きます。

まず以下を参考にjsonファイルを取得してください(以下ページの『認証情報の設定』まで行ってください。)

cf https://blog.serverworks.co.jp/2021/01/08/130956

作成しているpythonファイルのディレクトリーに同jsonファイルを置いてください。まず最初にコードをどうぞ。

python関連ライブラリ。
import sys
import os
from pydrive.auth import GoogleAuth
import gspread
#GoogleOauth認証関連ライブラリ。
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from apiclient.http import MediaFileUpload
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow


#ダウンロードした認証情報が保管してあるローカルのフォルダへのパス。GoogleAPIの認証画面で取得したjsonファイルを格##納するディレクトリーに格納。

CREDENTIAL_DIR = "~"

#認証情報ファイルまでのパス

CLIENT_SECRET_FILE = os.path.join(CREDENTIAL_DIR, 'client_secret.json')

#一旦API認証が成功した後の認証情報を記録するファイルのパス

CREDENTIAL_PATH = os.path.join(CREDENTIAL_DIR, 'credential.json')

#GoogleAPIで用いたAppNameを使用。

APPLICATION_NAME = "~"

#以下で操作する範囲のAPIエンドポイントを定義。

SCOPES = "https://www.googleapis.com/auth/spreadsheets"

#OAuth認証。
def get_credential():
#credentialファイルが存在すれば、それで認証する。
    creds = None
    if os.path.exists(CREDENTIAL_PATH):
        #credsに返り値であるcredentialsが格納される。
        creds = Credentials.from_authorized_user_file(CREDENTIAL_PATH, SCOPES)
# 未認証だった場合は許可を求める(ブラウザ認証)。
#credsに代入されていない場合、または、tokenが代入されていてもexpireしている場合次のif文の処理に移る。
    if not creds or not creds.valid:
        #credsに代入されていて、expireされていて、OAuthがtokenをrefreshする場合。
        if creds and creds.expired and creds.refresh_token:
            #アクセスtokenをrefreshする。括弧内のparameterはhttp request。
            creds.refresh(Request())
        else:
            #client_secrets_fileからFlowインスタンスを生成。
            flow = InstalledAppFlow.from_client_secrets_file(
                CLIENT_SECRET_FILE, SCOPES)
            #OAuth2.0のcreedentialに返す。credsに代入、
            creds = flow.run_local_server(port=0)
# 次回のためにcredential.jsonというファイルを書き込み権限で起案し、to_jsonでcredentialをJSON形式に生成。
        with open('credential.json', 'w') as token:
            token.write(creds.to_json())
    return creds

上記の通りで、コメントアウトしてる箇所を参照いただければ幸いです。基本的には、まずquich startを参照しています。https://developers.google.com/people/quickstart/python

google.oauthを用いる以外も、ouath2clientを用いた方法もありますが、非推奨なので進めません。
"Note: oauth2client is now deprecated. No more features will be added to the libraries and the core team is turning down support. We recommend you use google-auth and oauthlib. For more details on the deprecation, see oauth2client deprecation."

google.oauthのモジュールは右を参考にしてください。

https://google-auth.readthedocs.io/en/stable/reference/google.oauth2.credentials.html

return でcredsを返してるのは次の関数で、関連apiを呼ぶときに認証情報としてそれをひっぱてくるためです。例えば、gspreadを用いるなら右みたいに使います。gc = gspread.authorize(creds)

以上です。desktopアプリケーションでgoogleapiコンソール上で設定しましたが、1週間超えると再取得が必要になってきます。これは元からの仕様っぽいです。その時はすでに取得しているcredentialファイルを削除して改めてブラウザ認証で新しいcredentialを取得する必要があります。上のコードは私のgithubにあるので、urlおいときます。

https://github.com/Chimay-0426/OAuth_Authen/blob/main/How%20to%20OAuth2.0

もしご質問などあれば、コメント他ご連絡いただければ幸いです。

                                                              執筆者:SHIMMEI

この記事が気に入ったらサポートをしてみませんか?