2016/05/09更新

[Python] Google APIのOAuthを組み込みアプリケーションで行う方法

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
Webサービスではなく、コマンドラインベースなどのアプリケーション(=Installed Application)でGoogle APIをOAuth経由で利用する場合に、OAuth認証を行う方法をブログに書きたいと思います。

画像

目次




Google APIをOAuth認証で利用する場合のパターン

Google APIは幾つかの認証形式で利用することができますが、その中でOAuth認証を用いた方法で利用することが可能です。OAuth認証を用いることで、各ユーザーのアカウント権限でAPIを利用できるようになります。OAuthについての詳細は以下をご覧ください。

OAuth 2.0 | API Client Library for Python | Google Developers

そして、APIをOAuth経由で利用する場合に、アプリケーションの形態(以下)により、認証情報の取得方法が少しずつ異なります。
  1. Webアプリケーション
  2. AndroidまたはiPhoneアプリケーション
  3. 組み込みアプリケーション(Webブラウザ利用可)(☆今回はコレ
  4. 組み込みアプリケーション(Webブラウザ利用できない)
そして今回は、3つ目の「組み込みアプリケーション(Webブラウザ利用可)」の場合の、OAuth認証の方法を記述している次第です。



利用対象のAPI有効化と認証キーの取得

Googleの各サービスをAPI経由で利用する場合に、事前にAPI有効化と認証キーの取得を行う必要があります。具体的な手順は以下で記載しましたので、そちらを参照いただけますと幸いです。

[API] Google APIを使う際に、APIを有効化して認証キーを取得する方法

今回は上記の結果、以下のようなOAuth認証用のJSONファイルを取得できていればOKです。
# OAUth認証用のJSON例
{
    "installed": {
        "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", 
        "auth_uri": "https://accounts.google.com/o/oauth2/auth", 
        "client_id": "**クライアントID**", 
        "client_secret": "**クライアントシークレット**", 
        "project_id": "sample-project", 
        "redirect_uris": [
            "urn:ietf:wg:oauth:2.0:oob", 
            "http://localhost"
        ], 
        "token_uri": "https://accounts.google.com/o/oauth2/token"
    }
}



組み込みアプリケーション(Webブラウザ利用可)でOAuth認証を行う

この形態の場合には、以下のようなフローでOAuth認証を行います。
引用:https://developers.google.com/identity/protocols/OAuth2InstalledApp#overview

また、Python用ライブラリを利用しますので、事前に以下でインストールを行います。
pip install --upgrade google-api-python-client


実装する

それではここから実装を行います。まずは必要なライブラリをimportします。
import webbrowser
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
次に、OAuth認証用のURLを取得して、ブラウザで表示します。
# 利用するAPIのスコープを指定
SCOPE = 'https://www.googleapis.com/auth/bigquery.readonly'
# 認証フローを作成
flow = flow_from_clientsecrets(
    # API有効化時に取得したOAuth用のJSONファイルを指定
    'secret/oauth2.json',
    # スコープを指定
    scope=SCOPE,
    # ユーザーの認証後の、トークン受け取り方法を指定(後述)
    redirect_uri='urn:ietf:wg:oauth:2.0:oob')

# 認証用URLを発行して、ブラウザで表示する
auth_uri = flow.step1_get_authorize_url()
webbrowser.open(auth_uri)

# トークンをユーザーが入力するまで、処理を待つ
token = input("Input your code > ")
上記実装のredirect_uriで、ユーザー認証OKだった場合に、どのようにトークンを受け取るかを指定できます。ここでは、認証後に以下のようにブラウザにトークンが表示される形式を採用しています。
その他の指定方法は、Using OAuth 2.0 for Installed Applications | Google Identity Platform | Google Developersをご参照ください。


トークンが取得できたら、認証情報を作成します。
# 認証情報を作成する
credentials = flow.step2_exchange(token)
そして、最後にこの認証情報を今後使うために、ファイルに保存しておきます。
CREDENTIALS_FILE = "./secret/credentials"
Storage(CREDENTIALS_FILE).put(credentials)
ファイルに保存した結果は、以下のようなJSONファイルとなっており、API利用時に必要なaccess_tokenや、認証情報が期限切れになった場合に再取得で使うrefresh_tokenなどが保存されます。
{
    "access_token": "**アクセストークン**", 
    "client_id": "**クライアントID**", 
    "client_secret": "**クライアントシークレット**", 
    "refresh_token": "**リフレッシュトークン**", 
    "token_expiry": "2016-05-03T16:47:16Z",
    /*他省略*/
}
その後は、以下のように認証情報をファイルから取得して、API利用することができます(詳細は別でブログを書きます)。
### BigQueryを利用する場合の例

# APIサービスを作成
credentials = Storage(CREDENTIALS_FILE).get()
http_auth = credentials.authorize(Http())
service = build('bigquery', 'v2', http=http_auth)

# API実行
body = {
    "kind": "bigquery#queryRequest",
    "query": "SELECT 1 AS dummy  FROM [bigquery-public-data:hacker_news]  LIMIT 1"
}
project_id = "sample-project"
result = service.jobs().query(projectId=project_id, body=body).execute(http_auth)



参考資料

今回の実装を行うために、以下のGoogleリファレンスを参照しました。

OAuth 2.0 | API Client Library for Python | Google Developers

Using OAuth 2.0 for Installed Applications | Google Identity Platform | Google Developers



最後に

今回の内容は、急遽仕事で必要になったので実装しました。リファレンスを読むと以外に簡単にできることがわかりました。OAuthの面倒くさいハンドシェイク部分を、ライブラリがやってくれるので、GoogleのPythonライブラリはいい感じですね♪

最後になりますが本ブログでは、Python・Java・フロントエンド・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。