<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on Marketechlabo</title><link>https://www.marketechlabo.com/tags/python/</link><description>Recent content in Python on Marketechlabo</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Mon, 13 Jul 2020 00:00:00 +0900</lastBuildDate><atom:link href="https://www.marketechlabo.com/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>PythonプログラムでGoogle認証してGoogleのサービスを利用する</title><link>https://www.marketechlabo.com/server-infrastructure/python-google-auth/</link><pubDate>Mon, 13 Jul 2020 00:00:00 +0900</pubDate><guid>https://www.marketechlabo.com/server-infrastructure/python-google-auth/</guid><description>
&lt;p&gt;プログラムの中でGoogleのサービス（API）を操作するとき、Google認証が必要になる。しかしこれがややこしく、Googleの公式のドキュメントの記述も古かったりサービスの種類によって方法がばらばらだったりして分かりにくい。この記事ではこれを整理して説明する。&lt;/p&gt;
&lt;h2 id="プログラムでgoogle認証する場面"&gt;プログラムでGoogle認証する場面&lt;/h2&gt;
&lt;p&gt;具体的なケースを想定するとわかりやすいのだが、
たとえばGoogleアナリティクスからAPIでデータ取得し、そのデータをGoogle Cloud StorageやBigQueryに書き込みする場合、Googleアナリティクスのレポート閲覧権限（特定のビューに紐づいた）とGCPの権限（Google Cloud Storageの書き込み権限など）が必要になる。その権限を持ったGoogleアカウントで認証をすることになる。
この認証方法には大きく2通りの方法がある。&lt;/p&gt;
&lt;h2 id="2通りの認証方法"&gt;2通りの認証方法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;サービスアカウント認証：必要な権限を付与されたアカウント（プログラム用の特殊なアカウント＝サービスアカウント）を準備し、そのアカウントを使ってプログラムを実行する&lt;/li&gt;
&lt;li&gt;ユーザアカウント認証：一般のユーザ権限でプログラムを実行する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;プログラムの挙動としてはどちらを選んでもいいが、使い道に依存する。
1の場合、たとえばGoogleアナリティクスでは特定のビューに対する権限をあらかじめサービスアカウントに付与しておいて、そのビューに限定したデータにアクセスする用途になる。
2の場合はプログラムを使う人（ユーザ）が実行時に自分の権限をプログラムに与えるイメージ。アクセスできるビューはユーザ次第である（使うユーザによって異なる）。&lt;/p&gt;
&lt;h3 id="サービスアカウントとは"&gt;サービスアカウントとは&lt;/h3&gt;
&lt;p&gt;プログラム用の特殊なアカウント。Googleの画面にはログインできない。人間でない者（プログラムなど）が使うために設計されたアカウントである。
こんな形式のID&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="mailto:my-user-name@my-project.iam.gserviceaccount.com"&gt;my-user-name@my-project.iam.gserviceaccount.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;GCPまたはGoogle Developerの管理画面で発行し、その後権限を付与する。&lt;/p&gt;
&lt;h3 id="ユーザアカウントとは"&gt;ユーザアカウントとは&lt;/h3&gt;
&lt;p&gt;ユーザがパスワードを入力してログインするアカウント。GmailやGoogle Workspaceなどで使っているGoogleアカウントで、使うサービスの権限（特定のビューに対するGoogleアナリティクスの閲覧権限など）が付与されたもの。&lt;/p&gt;
&lt;h3 id="サービスアカウントとユーザアカウントの違い"&gt;サービスアカウントとユーザアカウントの違い&lt;/h3&gt;
&lt;p&gt;バッチプログラムのようにプログラムがスタンドアロンで動くアプリはサービスアカウント、人間が使うアプリはユーザアカウントを想定することが多い。もちろんプログラムがスタンドアロンで使うケースであってもユーザアカウントを使うことはある。
利用するサービス側（Googleアナリティクスなど）で管理者が追加的に権限を付与できないケースもポリシーによってはあり、その場合はユーザ権限での認証を採用する。
たとえばGoogleアナリティクスの場合、アナリティクスの管理者が誰に対して権限を付与するかの違いになる。
サービスアカウントを使う場合、アナリティクスの管理者がサービスアカウントに権限を付与する。権限が不要になった時には管理者がサービスアカウントに付与した権限を削除することになる。管理者がプログラムによるアクセスを承認する手続きである。
それに対してユーザアカウント認証では、アナリティクスの管理者がプログラムの実行者に直接権限を付与することはない。管理者に権限を与えられたユーザがさらにプログラムに対して権限を付与する（サービスの利用を承認する）ことになる。管理者がプログラムのアクセスを承認するのではなく、ユーザが勝手に（自分の権限の範囲内で）プログラムを利用しているという位置づけである。
これはアナリティクス以外のGoogleサービスでも同様である。
サービスアカウントは管理者が権限設定で権限をはく奪しない限りそのサービスを使えなくなることはないが、ユーザアカウントによって認証されたものでは時間が経過すると使えなくなることがある。その場合は再びユーザが権限を付与する手続きをしなければ使えない。したがって永続的に動作するプログラムの場合にはサービスアカウントを使うのが望ましい。
重要なのはどちらでもGoogleのサービスを利用することは可能だということ。それらの性質を分かったうえで状況別に使いこなせるようになることである。&lt;/p&gt;
&lt;h2 id="プログラムがgoogleサービスを利用するまでの全体の流れ"&gt;プログラムがGoogleサービスを利用するまでの全体の流れ&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;準備&lt;/li&gt;
&lt;li&gt;プログラムの実行
&lt;ol&gt;
&lt;li&gt;認証→&lt;code&gt;scoped_credentials&lt;/code&gt;の取得&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scoped_credentials&lt;/code&gt;を使って個別サービスのAPIを呼び出す&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;準備と認証の方法がサービスアカウントとユーザアカウントによって異なる。その後の個別サービスを呼び出すところは共通。&lt;/p&gt;
&lt;h2 id="準備から認証までサービスアカウントとユーザアカウントで違う部分"&gt;準備から認証まで（サービスアカウントとユーザアカウントで違う部分）&lt;/h2&gt;
&lt;h3 id="サービスアカウントの場合"&gt;サービスアカウントの場合&lt;/h3&gt;
&lt;p&gt;以下の例はGoogleアナリティクスのレポートAPIからデータを取得し、BigQueryに格納するケースを想定する。つまりGoogleアナリティクス（読込のみ）とBigQueryを使う。&lt;/p&gt;
&lt;h4 id="サービスアカウントの発行と認証キーの取得"&gt;サービスアカウントの発行と認証キーの取得&lt;/h4&gt;
&lt;p&gt;GCP／Google Developerのサービスアカウントの管理画面でサービスアカウントを発行し、認証キーを取得する。
サービスアカウントの発行画面は&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GCPの管理画面「IAMとサービス」→「サービス アカウント」
Google Developer Consoleの画面「IAMと管理」→「サービス アカウント」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="/images/python-google-auth/issue-service-account-gcp.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
またはGCP／Google Developer Console共通で&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「APIとサービス」→左メニューの「認証情報」→「認証情報作成」→「サービス アカウント」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="/images/python-google-auth/issue-service-account-google-developer-console.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
（どちらでもいい）
認証キーはJSONで取得する。このJSONに認証で必要な情報がすべて含まれている（パスワードが別などということはない）。&lt;/p&gt;
&lt;h4 id="サービスアカウントにgoogleサービスの権限を付与する"&gt;サービスアカウントにGoogleサービスの権限を付与する&lt;/h4&gt;
&lt;p&gt;権限付与はサービスによって大きく異なる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GCP（BigQueryやストレージなど）→IAMの設定画面&lt;/li&gt;
&lt;li&gt;その他Googleサービス（アナリティクス、ドライブなど）→各サービスのユーザ管理画面&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→各サービスのメールアドレスとして上記のIDを指定する
Google Search Consoleの場合
&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="/images/python-google-auth/assign-permissions-service-account-1.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
Googleアナリティクスの場合
&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="/images/python-google-auth/assign-permissions-service-account-2.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item></channel></rss>