背景
師いわく、MSALを使用してSSOを行うと、アクセストークンの有効期限が1時間だから
1時間毎に再認証が必要で、スマホ使っている人がアカウントを再選択する必要があるらしい。
ほんまか?
って思ったんですけど、ちゃんと調べた事は無かったので調査しました。
結論
1時間毎に再認証する必要はない。
ドキュメントから、デフォルト90日間連続して操作しなかった場合には再選択が必要になる。
ドキュメント調査
以下のリファレンスには期限切れが近いトークンを更新できると記載がある。
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/msal-acquire-cache-tokens#acquiring-tokens-silently-from-the-cache
また、期限切れが近いトークンを更新することもできます (トークン キャッシュには更新トークンも含まれるため)。
また、以下のページではトークンの有効期限が記載されている。
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/active-directory-configurable-token-lifetimes
デフォルト値は以下の通り
アクセストークン:1時間
更新トークン:90日間
イメージとしては ここ のブログに乗っている図がわかりやすい。(書いてあるのはADALの話だけど大きくは変わらないでしょう)
また、具体的な実装としては
acquireTokenSilentAsync(scope, authority, callback)
メソッドを呼び出すことで、アクセストークンをユーザに通知することなく取得する事ができる。
https://javadoc.io/doc/com.microsoft.identity.client/msal/2.0.2/com/microsoft/identity/client/ISingleAccountPublicClientApplication.html
Perform acquire token silent call.
If there is a valid access token in the cache, the sdk will return the access token;
If no valid access token exists, the sdk will try to find a refresh token and use the refresh token to get a new access token.
If refresh token does not exist or it fails the refresh, exception will be sent back via callback.
トークンのサイレントコールの取得を実行します。
キャッシュに有効なアクセストークンがある場合、SDKはアクセストークンを返します。
有効なアクセストークンが存在しない場合、SDKは更新トークンを見つけようとし、更新トークンを使用して新しいアクセストークンを取得します。
更新トークンが存在しないか、更新に失敗した場合、例外はコールバックを介して返送されます。
なので以下のような実装をすればトークンを自動的に更新できるはず。
ISingleAccountPublicClientApplication pca = ...; // 適当に取得する
IAccount mAccount = ... // サインインして取得
SilentAuthenticationCallback callback = ... // 適当にインターフェースを実装する
pca.acquireTokenSilentAsync({"user.read"}, mAccount.getAuthority(), callback);
結論として、1時間毎に再認証する必要はなく
デフォルトでは90日間ずっとアクセスしなかった場合に、スマホ利用者がADアカウントを再選択する必要がある。