Closed4

サービスアカウントを使ってGoogle Cloud APIのREST APIを叩くには

Yusuke IwakiYusuke Iwaki

Android Management APIには立派なHTTP REST APIがあるが、AMAPIのドキュメントにはAuthorizationヘッダーに何を指定しろというのが特にない。
https://developers.google.com/android/management/reference/rest/v1/enterprises/create

おそらく共通なんだろう。

チュートリアルはPythonのコードだが、

credentials = ServiceAccountCredentials.from_json_keyfile_dict(service_account_key, scopes)
androidmanagement = apiclient.discovery.build('androidmanagement', 'v1', credentials=credentials)

こんな感じでサラッとかかれている。HTTPリクエストを叩くまでに何をやっているのかさっぱりわからん。ということで調べてみた。

Yusuke IwakiYusuke Iwaki

サンプルコード(Java)からヒントを探ってみる。

Javaは型がかっちりしているので調べやすい。

GoogleCredential

その出処は・・・

googleapis.auth.oauth2

ほほー。

Yusuke IwakiYusuke Iwaki

OAuth2で、サービスアカウントに関する言及がされているページは・・・

https://developers.google.com/identity/protocols/oauth2/service-account?hl=en#httprest

下の方を見ていくと、Pythonの見慣れたコードがサンプルコードに載っている。なんとなくこれっぽいぞ。

HTTP/RESTというタブを見てみると・・・

https://developers.google.com/identity/protocols/oauth2/service-account?hl=en#authorizingrequests

間違いなくこれだ。JWTを作ってアクセストークンを発行してもらいなさい、と。

Yusuke IwakiYusuke Iwaki

JWTの作り方

ヘッダー: {"alg":"RS256","typ":"JWT"}.

{
"iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
"scope":"https://www.googleapis.com/auth/prediction",
"aud":"https://oauth2.googleapis.com/token",
"exp":1328554385,
"iat":1328550785
}

expはiatから1時間以内じゃないといけない。

実際にやってみる

Google ColabでPyJWTは残念ながら使えないらしい。

こっちなら使えるかな
https://github.com/googleapis/google-auth-library-python/blob/main/google/auth/jwt.py

signerは
https://google-auth.readthedocs.io/en/latest/reference/google.auth.crypt.html
にあるようにRSASignerを使う

トークン発行までやってみる

Android Management APIを試しに叩くと、HTTP 200 OKがキタ━━━━(゚∀゚)━━━━!!

このスクラップは2021/11/26にクローズされました