AWS
AWS Cognito を PHP SDK で操作する ~継続・ログアウト・パスワード再設定~

今回は継続・ログアウト・パスワード再設定を課題に

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などのほかのサービスを使ったログインをまとめたい