Closed4
サービスアカウントを使ってGoogle Cloud APIのREST APIを叩くには
Android Management APIには立派なHTTP REST APIがあるが、AMAPIのドキュメントにはAuthorizationヘッダーに何を指定しろというのが特にない。
おそらく共通なんだろう。
チュートリアルはPythonのコードだが、
credentials = ServiceAccountCredentials.from_json_keyfile_dict(service_account_key, scopes)
androidmanagement = apiclient.discovery.build('androidmanagement', 'v1', credentials=credentials)
こんな感じでサラッとかかれている。HTTPリクエストを叩くまでに何をやっているのかさっぱりわからん。ということで調べてみた。
サンプルコード(Java)からヒントを探ってみる。
Javaは型がかっちりしているので調べやすい。
GoogleCredential
その出処は・・・
googleapis.auth.oauth2
ほほー。
OAuth2で、サービスアカウントに関する言及がされているページは・・・
下の方を見ていくと、Pythonの見慣れたコードがサンプルコードに載っている。なんとなくこれっぽいぞ。
HTTP/RESTというタブを見てみると・・・
https://developers.google.com/identity/protocols/oauth2/service-account?hl=en#authorizingrequests
間違いなくこれだ。JWTを作ってアクセストークンを発行してもらいなさい、と。
- POST https://oauth2.googleapis.com/token
- form-urlencodedで
- grant_type:
urn:ietf:params:oauth:grant-type:jwt-bearer
- assertion: 作成したJWT
- grant_type:
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は残念ながら使えないらしい。
こっちなら使えるかな
signerは
にあるようにRSASignerを使うトークン発行までやってみる
Android Management APIを試しに叩くと、HTTP 200 OKがキタ━━━━(゚∀゚)━━━━!!
このスクラップは2021/11/26にクローズされました