LoginSignup
5
5

More than 1 year has passed since last update.

Cloud FunctionsのHTTP起動の認証について

Posted at

Google CloudのCloud Functionで起動トリガーをHTTPにした場合、誰でも処理を起動できないようにHTTPアクセスに対してデフォルトで認証が必要となります。この記事では、PythonでCloud FunctionsにHTTP(認証あり)接続を行う方法を紹介します。
 なお、基本的にはgoogleドキュメントのプログラムによるトークン生成を参考にしていますが、使用しているライブラリを「urllib」→「requests」に変更しています。(個人的な趣味の問題)

下準備

HTTPトリガーのCloud Functionsを準備します。これはサンプルなので関数などはデフォルトのままで準備してもらえば大丈夫です。僕はPython3.9をランタイムとして選択しました。キャプチャ.JPG

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)あるんですが、なんか理由があるんですかね・・・誰か教えてください。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5