前提: Cognitoユーザープールの設定
この記事では、以下の通りに作成したユーザープールとアプリクライアントを使います。
- サインインはユーザー名で行う
- 必須の標準属性は無し (メアドも無し)
- ユーザーに自己サインアップを許可しない
- 一時パスワードの有効期限は1日 (サーバー側で即座に更新するので何日でもいい)
- 属性は検証しない (メアドも電話番号も無いので)
- アプリクライアントの『クライアントシークレットを生成』ON (プール作成時しか設定できないので注意)
- アプリクライアントの『サーバーベースの認証でサインインAPIを有効にする』ON
ユーザーに自己サインアップを許可せず、メアド等の検証も行わないので、ケースとしては完全に裏方としてCognitoを使う場合になると思います。ユーザー名とパスワードには、ユーザーが入力した値を使用します。
なお、メアド等の属性を検証するユーザープールだとステータス遷移が異なるっぽいので、この記事の方法でできるかは分かりません。adminConfirmSignUp()
を使えば検証もサーバーサイドで済ませられるので、そこらへんを使うのかも。
必要なものインストール
サーバー側のアプリに aws-sdk
をインストールします。
ユーザー登録 (サインアップ)
ユーザーに自己サインアップを許可しない場合、ユーザー登録には adminCreateUser()
を使います。
ユーザーを作成した後、即座に adminSetUserPassword()
で一時パスワードを変更すれば、すぐにユーザーを使える状態になります。
adminCreateUser()
のレスポンスは以下のような感じでした。
サインイン
サインインには adminInitiateAuth()
を使います。
ここではアプリクライアントシークレットを生成してるので、このメソッドはシークレットハッシュをパラメータに指定して呼び出す必要があります。
この時の adminInitiateAuth()
のレスポンスは以下のような感じでした。
トークンのリフレッシュ
IDトークン・アクセストークンのリフレッシュは、サインインと同様に adminInitiateAuth()
を使います。
必要なのはリフレッシュトークンだけで、ユーザー名とパスワードは要りません。
この時の adminInitiateAuth()
のレスポンスは以下のような感じでした。サインインの時と異なり RefreshToken
が入ってないです。
サインアウト
サインアウトには adminUserGlobalSignOut()
を使います。
注意点ですが、サインアウトで無効になるのはアクセストークンとリフレッシュトークンだけです。 IDトークン (API Gatewayでオーソライザーに使えるやつ) は無効になりません。 試しにサインアウト後にIDトークンでAPI Gatewayを叩いてみれば分かります。
なんでだろと一瞬思いましたが、そもそもIDトークン自体が有効期限の情報を含んだJSON Web Tokenなので、考えてみればそういうものかもしれません。IDトークンの検証なら、API Gatewayのオーソライザーに限らずユーザーが手動でもできるわけですから。
なのでIDトークンを即座に無効にしたい場合、アプリ側でユーザーがログアウト済みかどうかを別途管理する必要があります。
ユーザー取得
ユーザーの取得には adminGetUser()
を使います。
レスポンスの例は以下です。ユーザー登録時の戻りと微妙に違うので注意です (Attributes
が UserAttributes
になってる)。
ユーザー削除
ユーザーの削除には adminDeleteUser()
を使います。
以上
他にも、ここに書いてないメソッド使ったら都度追記します。