Google CloudのCloud Functionで起動トリガーをHTTPにした場合、誰でも処理を起動できないようにHTTPアクセスに対してデフォルトで認証が必要となります。この記事では、PythonでCloud FunctionsにHTTP(認証あり)接続を行う方法を紹介します。
なお、基本的にはgoogleドキュメントのプログラムによるトークン生成を参考にしていますが、使用しているライブラリを「urllib」→「requests」に変更しています。(個人的な趣味の問題)
下準備
HTTPトリガーのCloud Functionsを準備します。これはサンプルなので関数などはデフォルトのままで準備してもらえば大丈夫です。僕はPython3.9をランタイムとして選択しました。
HTTP接続(認証なし)
Pythonのrequestsモジュールを利用して、作成したCloud FunctionsのトリガーURLにGETでアクセスします。
import requests
def make_no_authorized_get_request(target_url):
response = requests.get(target_url)
return response
if __name__ == "__main__":
result = make_no_authorized_get_request(
"ここに作成したCloud FunctionsのトリガーURLを記載"
)
print(result.text)
実行結果は以下の通りです。
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>403 Forbidden</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Forbidden</h1>
<h2>Your client does not have permission to get URL <code>/function-2</code> from this server.</h2>
<h2></h2>
</body></html>
permissionエラーが出力されました。
HTTP接続(認証あり)
次に認証ありの場合で実装していきます。
import requests
import google.auth.transport.requests
import google.oauth2.id_token
def make_authorized_get_request(target_url):
auth_req = google.auth.transport.requests.Request()
id_token = google.oauth2.id_token.fetch_id_token(auth_req, target_url)
headers = {
"Authorization": f"Bearer {id_token}"
}
response = requests.get(target_url, headers=headers)
return response
if __name__ == "__main__":
result = make_authorized_get_request(
"ここに作成したCloud FunctionsのトリガーURLを記載"
)
print(result.text)
結果が以下の通りです。
Hello World!
おーうまくできました。
ちなみに、GETメソッドをパラメータありで実行することも簡単です。
import requests
import google.auth.transport.requests
import google.oauth2.id_token
def make_authorized_get_request(target_url):
auth_req = google.auth.transport.requests.Request()
id_token = google.oauth2.id_token.fetch_id_token(auth_req, target_url)
headers = {
"Authorization": f"Bearer {id_token}"
}
params = {
"message":"sample message"
}
response = requests.get(target_url,headers=headers, params=params)
return response
if __name__ == "__main__":
result = make_authorized_get_request(
"ここに作成したCloud FunctionsのトリガーURLを記載"
)
print(result.text)
実行結果は以下の通りとなり、paramsで指定した値を取得できました。
sample message
最後に
googleのドキュメントだとmake_authorized_get_requestの引数が、2つ(service_url、audience)あるんですが、なんか理由があるんですかね・・・誰か教えてください。