simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

AWS:LambdaにAuthorizerを設置してからAPIGatewayを公開する

前書き

インスタンスを start するだけで docker コンテナが起動して、機能し始めるというのは用意できてます。
あとはこれを PlayFab から HTTP リクエストで呼び出すだけ、なのですが、ここで公開 API でありつつも
認可の仕組みありきという API Gateway と接続した Lambda のお仕事にするので、そのあたりの具体的な手順と概念について記録します。

API Gateway

Lambda の試験を終えて、外から呼び出そうとトリガーに API Gateway を追加します。(ウィザードで新規作成)
f:id:simplestar_tech:20200719123820p:plain

プロトコルを HTTP にして、Authorizer 作成をします。

発行者URLに AWS Cognito の次の形式の url を書いて渡します
https://cognito-idp.us-west-2.amazonaws.com/us-west-2_XXXXXXX

一緒に Client ID を求められるので、 AWS Cognito でアプリクライアントを新規登録して、それの ID を打ち込みます。

これで Authorizer 設定完了

AWS Cognito

作るだけです。
昔やった
simplestar-tech.hatenablog.com

で、ユーザーのサインアップを許可しますか? 管理者のみがユーザーを作成できます として、勝手にユーザー追加されないようにします。

で、管理者としてユーザーを追加した後
Amazon Cognito ドメイン名を空いている prefix で取得し、次の通り、リダイレクトURL付で URL を作って
docs.aws.amazon.com

ログインの画面を開きます

あー実は 有効な ID プロバイダを Cognito で作らないとダメ(次の画面の設定にする)

f:id:simplestar_tech:20200719124633p:plain

管理者が追加した e-mail ユーザーに初回パスワードが送られてくるので、このログイン画面で初回パスワードを入れログインし
すぐに新しいパスワードに切り替えて、認証成功させる

上記画像のリダイレクト url とリクエストする リダイレクト url が一致しないとエラー画面になるので、しっかり合わせること
一つでも間違えると、理由なきエラー画面なので、なんとかネット上のやりとりで、url に違いがあるとダメということにたどり着けた

これでログイン画面の表示と、正しい email と パスワードでログイン成功となる
成功すると、リダイレクト後の url に AuthorizationCode つまり code=~~のクエリ文字列があるので記録する

Authorization Code

さっきリダイレクト url で code= で得たものを
/login
と同様に
/oauth2/token
のcode=AUTHORIZATION_CODEに設定して、次の通り POST リクエストを送る

docs.aws.amazon.com

サンプルでいうところのこれ

POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token&
Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic aSdxd892iujendek328uedj

grant_type=authorization_code&
client_id=djc98u3jiedmi283eu928&
code=AUTHORIZATION_CODE&
redirect_uri=com.myclientapp://myclient/redirect

ああ、 Basic の次に続くやつは Baes64 文字列で、変換元は "client_id:client_secret" これは Cognito の管理画面で手に入る

得られる json を見ると長ーい文字列で

"id_token" が得られるので、これを記録
あと、Cognito でトークンの有効期間が設定できて、最長で 10年設定できる(今日から10年に設定した)

API Gateway を呼ぶ

これで設定した Authorizer にマッチする管理ユーザーの 10年有効な id_token を得られたので、Authorizer 設定で指定した通り Authorization ヘッダーに仕込む

自分はこれで認可されて APIGateway の先の Lambda をたたくことができた

追記

実は id_token は 3600秒後にかならず有効期限が来て使えなくなります。
一緒に refresh token が得られていると思うので、

grant_type = refresh_token
refresh_token = それ

として oauth2/token API をたたきます

更新トークンは 30~最大設定で 3650 日、有効なので

また id_token を 1時間で有効期限付きで取得できます。

自動化したいなら更新トークンで id_token を得て、その id_token で API Gateway の Lambda を実行する、といった感じですね


参考:こちらはトークンオーソライザー使ってますね(過去の自分)
simplestar-tech.hatenablog.com