📑

curlでIAP超えのアプリAPIを叩く

2022/01/10に公開

IAPでアクセス制限しているアプリに対し、curl(シェル)でAPIを叩く方法についてまとめてみます。

IAPとは

IAPは、Google CloudのサービスでIdentity-Aware Proxy(IAP)のことです。
IAPは、Webサイト(アプリ)に対し、認証されたユーザーにのみアクセスを許可するというサービスです。
社内システムで、社員のみにアクセス可能とするということが可能です。

https://cloud.google.com/iap

認証手順

なんとなく、以下を見るとtokenを取得して、httpのAuthorization: bearerに入れれば良さそうですが、手順がわかりずらいです。
https://cloud.google.com/iap/docs/authentication-howto

なので、以下に手順をまとめておきます。

事前準備

curlを実行する前に、以下を準備します。

  1. サービスアカウントを作成する
  2. IAP で保護されたプロジェクトのアクセスリストにサービス アカウントを追加する
  3. AUD(ウェブアプリケーションのクライアントID)を取得
        xxxx.apps.googleusercontent.comの形式のID。
        

IAP超えのcurl実行手順

1. TOKENを取得

gcloud authprint-identity-tokenコマンドを使い、サービスアカウントのtokenを取得します。
また、このとき受け取り側のID(AUD)をtokenに設定する必要があるので、--audiencesオプションを指定します。

TOKEN=`gcloud auth print-identity-token ”サービスアカウント” --audiences=”AUD※”`
※事前準備3で取得したクライアントID

2. curl実行

tokenが取得できたら、そのtokenをAuthorization: Bearerに設定し、curlを実行します。

curl -H "Authorization: Bearer $TOKEN"  -X 'POST' http://xxxxx.xxx.xx.xx/xxx -H 'accept: application/json' -H 'Content-Type: application/json' 

アプリケーションにユーザ認証がある場合は、Proxy-Authorizationを使用して--userでユーザ/パスワードを指定します。

curl -H "Proxy-Authorization: Bearer $TOKEN" --user $USER:$PASS -X 'POST' http://xxxxx.xxx.xx.xx/xxx -H 'accept: application/json' -H 'Content-Type: application/json' 

最後に

IAPのマニュアルには、いろいろ記載してありましたが、やってみると2コマンドでIAP超えのcurlは叩けました。
ユーザ認証ありだとProxy-Authorizationにする必要があるというところが少し詰まったところでしたが、他は簡単にできました。

pythonなどのプログラムからのアクセスは、以下のマニュアルにサンプルもありますので、そちらを参考にして頂ければと思います。
https://cloud.google.com/iap/docs/authentication-howto#iap_make_request-python

Discussion