前書き
インスタンスを start するだけで docker コンテナが起動して、機能し始めるというのは用意できてます。
あとはこれを PlayFab から HTTP リクエストで呼び出すだけ、なのですが、ここで公開 API でありつつも
認可の仕組みありきという API Gateway と接続した Lambda のお仕事にするので、そのあたりの具体的な手順と概念について記録します。
API Gateway
Lambda の試験を終えて、外から呼び出そうとトリガーに API Gateway を追加します。(ウィザードで新規作成)
プロトコルを 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 で作らないとダメ(次の画面の設定にする)
管理者が追加した e-mail ユーザーに初回パスワードが送られてくるので、このログイン画面で初回パスワードを入れログインし
すぐに新しいパスワードに切り替えて、認証成功させる
上記画像のリダイレクト url とリクエストする リダイレクト url が一致しないとエラー画面になるので、しっかり合わせること
一つでも間違えると、理由なきエラー画面なので、なんとかネット上のやりとりで、url に違いがあるとダメということにたどり着けた
これでログイン画面の表示と、正しい email と パスワードでログイン成功となる
成功すると、リダイレクト後の url に AuthorizationCode つまり code=~~のクエリ文字列があるので記録する
Authorization Code
さっきリダイレクト url で code= で得たものを
/login
と同様に
/oauth2/token
のcode=AUTHORIZATION_CODEに設定して、次の通り POST リクエストを送る
サンプルでいうところのこれ
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