Google Cloud Platform IT

GCPのさまざまなAPI認証方法

2022年7月22日

gcp

GoogleではさまざまなAPIでソリューション提供をしています。
そしてAPIを使用するには、もちろんAPIの中身やレスポンスデータの中身によって、
キーや認証方法の厳しさなどがあります。
一般的なデータを扱うAPIであれば、簡単なキー発行だけで済みますが、
ユーザーのデータを扱う場合は個人情報等もあるため、キー発行だけではなくGoogleとのやりとりを通じて認証してもらうみたいなかなり時間のかかるものも中にはあったりします。
ここではそんなAPIの認証方法である以下3つの方法についてまとめていこうと思います。

  • APIキー
  • サービスアカウント
  • OAuth同意認証

発行難易度としては以下の順です。
APIキー、サービスアカウント、

そもそもAPIとは

通常私たちは、さまざまなサービスやアプリケーションをGUIで手軽に使用できていたります。
しかし、それをプログラムを用いて操作したかったり、することもあると思います。
その際にそのサービスを提供する事業者がAPIサーバを立てて、そこにリクエストをすることでプログラムで操作できたり、そのサービスを自分たちのサービス上で使用できるようにしたりといろんな恩恵を受けるようにしています。
 

ただ、誰しもそのAPIサーバにアクセスして操作できてしまうのは危険です。
当然自分達のサービスを提供するので、悪意あることに使われてほしくないし、
そのため通常は使用するためには認証を行い、問題がなければキーを渡して、そのキーを用いてリクエストをすることで問題なく処理をしようと言うのが構図です。
 

APIキー

クエリパラメータにAPIキーをのせて、APIサーバにリクエストをかけることで、認証が完了してアクセスができます。

GCPでAPIキー発行すると、GoogleはそのキーをAPIサーバの認可に登録をします。
そして僕たち利用者はそのAPIサーバにリクエストをする際にパラメータやペイロードにキーを乗せることで、その情報をもとにGoogleは認証して、
APIサーバへアクセスできるようになります。
 

さらに計算処理をしてくれるようなAPIサーバ、
例えばよくあるのが、何か税金などの計算をするとき、そういった計算をしてくれるAPIサーバを公開していて、
そこにリクエストするときに、各種金額を入力して、パラメータやペイロードに乗せてリクエストをすることによって、APIサーバがそれを受け取って計算し、レスポンスとしてその計算結果を返すみたいなこともあったりします。
 

(よくあるものとしては、一般的な公開データを取得したいとか、リクエストを投げてその値で処理をしてレスポンスで返すような計算処理のようなもの)
 


上の認証情報を作成から、APIキーを発行をクリックすることで、上みたいにAPIキーが発行されます。
基本的にGoogleが提供するAPI(GCPに記載あるAPI)で、APIキーを共通で使用できますが、不正使用されないように、どのAPIでのみ使用できるキーかを設定しておくのがいいでしょう。
普通であれば各APIごとにAPIキーは分けるのがベストです。

 
Google Map APIはユーザーのデータを使用しません。
以下のように、APIサーバのエンドポイントURLにクエリパラメータkey=発行したAPIキーをつけて、リクエストすることで、APIの実行をすることができます。
https://www.zenrin-datacom.net/solution/gmapsapi/api_key

 

サービスアカウント

GAなどに権限付与して、それに倒してプログラム実行して処理をする。

サービスアカウントを発行して、各種
通常のメールアドレスが発行されて、そのメールアドレスを用いてGoogleが提供するサービスに権限を付与します。
それによってそのサービスのAPIをサービスアカウントの権限を用いて処理を行うということができます。
例としては、

ただYoutbe Analytics APIなど、サービスアカウントに権限付与できないサービスも存在するので、そういった場合APIを使用する場合は、
OAuth同意認証などを用いて処理をする必要がある。

デメリットとしては、
jsonキーなどを紛失したり、どこかに流出した場合、それが悪用される可能性が高いので、管理を気をつけることと、
Googleのサービスに権限を付与して使用するため、誰かがこのメールアドレス何?ってことで削除してしまったら使用できなくなるなど、
そういった面で管理面でデメリットが生じる。

ただ簡単に自分達で使用しているGoogleのサービスに対してAPI実行してデータ取得できるのはお得です。

自分たちは、Googleアカウント(例: aaa@gmail.com)でログインして、その状態でaaa@gmail.comに権限付与されたGoogle Analyticsのアカウントやプロパティにアクセスできます。
サービスアカウントは、アプリケーション自身(プログラム)がユーザーの代わりとなってそのサービスにアクセスするというものであるので、
プログラム内であんたはこのメールアドレス(サービスアカウント@...gserviceaccount.com)で、GAにそのメールアドレスに対してアクセス権限を付与して、そうすることでプログラムからAPIによってアクセスしてその権限内で処理をすることができるということになります。

このような感じで、GA側などのアプリケーションにサービスアカウントのメールアドレスに対してアクセス権限付与して、クライアントサイドではjsonキーで認証をするので、そのjsonキーが流出してしまった場合、すぐGAなど権限付与したところから権限削除するか、どこに権限付与したか不明な場合はサービスアカウント自体の削除を行う必要があるため、管理には十分注意が必要です。

 

さらには、Compute Engineなどのサーバにも実はデフォルトでサービスアカウントの発行がされています。
サービスアカウントの認証/プログラム実行するところを基点とした時、Compute Engineがクライアントサイドになり、リクエスト先がサーバとなるので、Compute Engine自体にももちろんサービスアカウントのjsonキーを置いて実行することが可能です。

使用方法としては、

  • 1. 環境変数設定でサービスアカウントのjsonキーを設定
  • 2. サービスアカウントのメールアドレスで各種ソリューションへアクセス権限の付与をする

です。

②のイメージとしては、
Google AnalyticsのAPIを使用する場合は、
例えば、Google Analyticsにサービスアカウント生成時に発行されたメールアドレスで権限付与します。

BigQuery APIを使用する場合は、
GCPのIAM設定でそのサービスアカウントにBigQuery管理者であったり、必要は権限を付与します。

そして①については以下のサンプルプログラムを作ってみました!
簡単に使用する方法です。

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

from google.oauth2.service_account import Credentials
from googleapiclient import discovery

from os import path


def get_results(service):
    
    # Google Analytics APIなどの処理の記載


if __name__ == '__main__':

    # サービスアカウントの認証
    credential_file = '<サービスアカウントのjsonキー>'
    c = Credentials.from_service_account_file(credential_file)

    # Google Analyticsのmanagement APIを使用
    service = discovery.build('analytics', 'v3', credentials=c)

    account_list = get_account_list()
    get_results(service)

    exit(0)

以下、環境変数GOOGLE_APPLICATION_CREDENTIALSに付与する方法。

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import sys
import json
import os

"""A simple example of how to access the Google Analytics API."""

# https://qiita.com/r2en/items/f0e86642eb5e6a40703a
from google.cloud import bigquery
from google.oauth2 import service_account
from google.oauth2.service_account import Credentials

import sys

from datetime import datetime
from google.cloud import storage
import time


def main():

    # サービスアカウントの認証
    CONFIDENTIAL_FILE = '<サービスアカウントのjsonキー>'
    os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = CONFIDENTIAL_FILE

    query = """ select * from `firebase-public-project.analytics_153293282.events_*` """

    client = bigquery.Client()

    query_job = client.query(query)
    query_result_data = query_job.result()

if __name__ == "__main__":
    main()

上記API実行するためのプログラムと同じ階層にサービスアカウントを作成した際に発行したjsonキーを置きます。
そしてクライアントサイドでの環境変数にjsonキーを設定することで、処理をします。
 

OAuthクライアントID (これはOAuth同意認証設定をした後でないと発行できない)

https://messefor.hatenablog.com/entry/2020/10/08/080414


https://app.diagrams.net/#G1UfkVOB7SI7lNfprDAUKTaOr3XLY6AVMk

GoogleではAPIごとに、機密性の高いスコープや制限付きスコープなどが決められている。
それはOAuth同意認証の中で確認をすることができる。
OAuth同意認証の設定の中で、以下のように
非機密のスコープ、機密性の高いスコープ、制限付きのスコープの3種類があります。
機密性の高いスコープではGoogleが
ちょうど画面にありますが、Google Analyticsはユーザーのアクセスデータを収集しているので、そのデータを使用しようとすると、以下のように機密性の高いスコープに認定され、Googleによる事前の審査が必要になります。
(GAのCore Reporting APIは集計データのみ(cookieなし)、managemen APIは内部ユーザなので、基本的にサービスアカウントだけでも問題はないのか?、あとはGoogle Analytics APIではアカウントやプロパティ、ビューの作成などであればユーザーデータは参照しないので、非機密スコープになったりと、1つのAPIでも内容によっては問題なくGoogle認証いらないものもあったりします。)
そしてより制限付きスコープではより個人的な情報を使う際に必要。ここに認定されたAPIを使用する場合は、Google認証だけではなく、第三者機関による認証も必要になります。そうなるとどの第三者機関に依頼する金額は実費になるので月50000円ほどかかかります。
 

OAuthクライアントID発行

OAuthクライアントID発行をしてアプリケーション内に指定することによって、
APIにリクエストするときにOAuth同意認証画面が表示されます。
 

ただOAuth同意認証画面設定を先にしないと発行することはできません。まず同意画面設定をしましょう。
 

\(①\): 非機密スコープ

OAuthクライアントIDを発行して、それを設定します。
その実行をすることで、以下のようにOAuth認証画面が表示されます。

 

\(②\): 機密性の高いスコープ

機密性の高いスコープは、ユーザーのデータを扱うようなAPIに認定されるものです。
例えばユーザー単位の行動などをみれたりする、Google Anlaytics APIであったり、
Youtube Analytics APIであったりが、この機密性の高いスコープとして認定しています。

この機密性の高いスコープに認定されているAPIをOAuth同意認証の中に1つでも含めると、Googleとの認証をする必要があります。
 

\(③\): 制限付きスコープ

そして、機密性の高いスコープよりもさらにレベルの高いものとして、制限付きスコープというものがあります。
こちらのものに認定されたAPIを使用する場合、
上記の機密性の高いスコープであった、Googleにどんなアプリケーションで使用するのかの承認を受けるだけではなく、第三者機関にもアプリケーションを確認してもらい、それで認証を得る必要があります。
そうなった場合、第三者機関への申請や確認費用などは別途自分たちで負担をする必要があります。

スコープはAPIにアクセスすることでそのリクエストに権限が付与されます。
スコープごとにAPIがあり、そのAPIにリクエストすると、このスコープはユーザー管理のスコープなので、ユーザー管理系の権限付与をしてくれます。
それらの権限によって、やっとGoogle Analytics APIサーバなどへリクエストして、ユーザー管理系の情報を得ることができるわけです。

自分がOAuth同意認証を用いて、実行したいAPIがどのスコープに該当するのかについては、
GCPのOAuth同意認証の設定のstepの中の以下の画面で、「スコープの追加と削除」をクリックしていただき、右で使用したいAPIのリストが出るので、
鍵マークのないAPIは\(①\)、白い鍵のマークのAPIは\(②\)、黒い鍵のマークのAPIは\(③\)を表しています。

OAuth同意認証の公開ステータス「テスト環境」

テスト環境にすることで、上記のように「機密性の高いスコープ」「制限付きスコープ」でのGoogleによるアプリケーション承認のやり取りをする必要がなくなります。
しかし、100ユーザーしか同意認証できないなど制限があるため、一般向けに提供するアプリケーションの場合、100ユーザーが同意認証した時点で、それ以降はユーザーにアラート画面が表示されるようになってしまいます。
そうなった場合、このアプリケーション個人情報どう使われてるかわからなくて不安にさせ、アプリから離脱されたり登録解除、アンインストールなどされてしまいます。
なので、アプリの構築段階での使用がベストです。
 

OAuth同意認証での認証方法には、アクセストークンというものとリフレッシュトークンという2つのトークンが存在します。

-Google Cloud Platform, IT
-

© 2022 Yosshi Blog Powered by AFFINGER5