今回は継続・ログアウト・パスワード再設定を課題に
「AWS Cognito を PHP SDK で操作する ~ユーザ作成~」「AWS Cognito を PHP SDK で操作する ~認証~」で、ユーザー作成〜認証まで確認したが、AccessTokenの更新、サインアウト、パスワードを忘れたときのフローを今回は確認する
とりあえず、今回はこんな感じでまとめておく
1.Tokenの更新
前回、AccessTokenを取得して、ログイン状態を確認したが、AccessTokenは時限性で何もしなければページ間の移動などでは更新されない。なので、このままでは作業途中に強制ログアウトして、再度ログインを行う必要が出てくる。
実は前回のAccessTokenを取得する際に、RefreshTokenなるものが発行されている。これを使うと新しいAccessTokenを取得できるので、それを使用する。
更新には、ログイン時と同じ、adminInitiateAuth の AuthFlow を REFRESH_TOKEN_AUTH を指定し、パラメーターに REFRESH_TOKEN を設定して渡す。
<? php
~aws認証部分は前回同じなので、略~
try {
$result = $client->adminInitiateAuth([
'AuthFlow' => 'REFRESH_TOKEN_AUTH',
'AuthParameters' => [
'REFRESH_TOKEN' => $_COOKIE["RefreshToken"]
],
'ClientId' => $clientID,
'UserPoolId' => $userPoolId
]);
} catch (AwsException $e) {
// output error message if fails
echo $e->getMessage() . "\n";
error_log($e->getMessage());
}
?>
AuthenticationResult に 更新されたtokenが返ってくるのでcookieなどに再セットする。
ただ、試したところtokenが更新されたとしても、発行済みtokenの有効期限が切れていなければ使用することができる。また、ユーザープール > アプリケーションの統合 > 使用しているアプリケーションクライアントの情報を編集することで各種tokenの有効時間をセットすることができる。
2.サインアウト
サインアウトは、GlobalSignOutにAccessTokenを渡すだけ。
サインアウトを行うと、ユーザーに発行されたすべてのリフレッシュトークンを無効化する。が、有効期限の切れていないAccessTokenとIDtokenは消えない。そこで、RevokeToken を使用することでtokenの取り消しを行うこともできるが、RefreshTokenが必要となるので、GlobalSignOutの前に行うことで、全てのtokenをリセットすることができる。
<? php
~認証部分は同じなので、略~
$client->revokeToken([
'ClientId' => $clientID,
'Token' => $_COOKIE["RefreshToken"],
]);
$client->GlobalSignOut([
'AccessToken' => $_COOKIE["AccessToken"]
]);
?>
3.パスワードを忘れたとき
パスワードを忘れてしまったユーザーがパスワードリセットを行いたい時には二つのフローをふむ。まず、forgotPasswordを使用して、該当のUsername宛にメッセージをコードを送信する。
<? php
~認証部分は同じなので、略~
try {
$result = $client->forgotPassword([
'ClientId' => $clientID,
'Username' => $email,
]);
} catch (AwsException $e) {
// output error message if fails
echo $e->getMessage() . "\n";
error_log($e->getMessage());
}
?>
この備忘録では、usernameはe-mailで設定しているので、mailに確認コードが送られてくる。新しいパスワードを設定するのに必要となる。
続いて、confirmForgotPasswordを使用して、確認コードや新しいパスワードなどをセットして実行すれば新しいパスワードになる。
<? php
~認証部分は同じなので、略~
try {
$client = new CognitoIdentityProviderClient($config);
$result = $client->confirmForgotPassword([
'ClientId' => $ClientId,
'ConfirmationCode' => '送られてきたコード',
'Password' => '新しいパスワード',
'Username' => $email,
]);
}catch (AwsException $e) {
// output error message if fails
echo $e->getMessage() . "\n";
error_log($e->getMessage());
}
?>
これで二段階認証を使用しないシンプルなユーザー認証システムができるはず。ユーザー情報の編集は、前々回の「キーの確認済み処理」の adminUpdateUserAttributesでできるからよしとする。
次回以降は、二段階認証やGoogleなどのほかのサービスを使ったログインをまとめたい