Auth0のアプリケーションで予期しないログアウトが発生する問題の原因と対策
最近、「Auth0を使用してログインしたユーザーが予期せずアプリケーションからログアウトされる」という問い合わせが増えてきました。
どういう状況で
ログアウトしてしまう要因は色々と考えられます。詳しくは公式ドキュメントを参照してください。
その色々ある中から、可能性の高そうなログアウトの要因をピックアップして挙動を検証していきます。
- (1)アプリケーションレイヤー
- トークンの有効期限が切れた
- (2)Auth0セッションレイヤー
- 認可サーバーのセッションの有効期限が切れた
クライアントアプリケーションはReact.js(SPA)を使用します。
(1)アプリケーションレイヤー
前提
Auth0でログインした後、アクセストークンとIDトークンを含むトークンを取得し、インメモリで保持しています。
POST https://{domain}.auth0.com/oauth/token { "access_token": "...", "id_token": "...", "scope": "openid profile email", "expires_in": 86400, "token_type": "Bearer" }
このトークンのaccess_tokenとid_tokenをデコードすると、ペイロードにexpというClaimがあり、これがaccess_tokenとid_tokenの有効期限をUNIXタイムスタンプで表しています。
また、トークンのexpires_inは取得日時からの経過秒を表しています。
まとめると以下のように整理できます。
格納場所 | 有効期限を示す属性名 | 有効期限を示す値の意味 |
---|---|---|
access_token | exp | 有効なUNIXタイムスタンプ |
id_token | exp | 有効なUNIXタイムスタンプ |
トークン | expires_in | 取得日時からの経過秒数 |
3つも有効期限が出てきましたが、Auth0でログアウトの判定となるのはどの有効期限が切れたときなのでしょうか。検証していきます。
検証
①access_token有効期限切れ
Auth0ダッシュボード > APIs > Auth0 Management API > Token Settings > Token Expiration
発行してすぐに有効期限が切れるように設定します。
ログインします。
ブラウザのデバッグコンソールのaccess_tokenをデコードすると、確かに60秒にセットされていることが分かります。
{ ...省略... "iat": 1714831800, "exp": 1714831860, ...省略... }
60秒経過してブラウザをリロードしてもログアウトしません。
この値は、直接ログアウトには影響しないようです。
②id_token有効期限切れ
Auth0ダッシュボード > Applications > アプリケーション名 > Settings > ID Token
発行してすぐに有効期限が切れるように設定します。
ログインします。
ブラウザのデバッグコンソールのid_tokenをデコードすると、確かに60秒にセットされていることが分かります。
{ ...省略... "iat": 1714831386, "exp": 1714831446, ...省略... }
60秒経過してブラウザをリロードしてもログアウトしません。
この値は、直接ログアウトには影響しないようです。
③トークン有効期限切れ
expires_inは、access_tokenと同じ有効期限がセットされます。
access_tokenと同じく、この値も直接ログアウトには影響しません。
結論
いずれのケースもログアウトにはなりませんでした。これは、Auth0セッションが有効な間は Silent Authentication が行われ、ユーザーが意識することなく再認証が行わているからです。Auth0のログにもそのように残っています。
ソースコードを眺めてみるとより理解が深まるかも知れません。
Auth0セッションのライフタイムは、ログイン時にブラウザCookieで管理します(後述します)
トークンの検証が終わりました。次は、セッションについても検証していきます。
(2)Auth0セッションレイヤー
前提
Auth0で認証を行うと、Auth0サーバーはユーザー固有のセッションを生成し、その識別子をSet-Cookieヘッダーに付帯させてレスポンスします。
検証
セッション有効期限切れ
Auth0ダッシュボード > Settings > Advanced > Login Session Management
ログインしてすぐに有効期限が切れるように設定します。
ログインします。
ブラウザのデバッグコンソールのクッキーを見てみると、確かに10分にセットされていました(auth0という名称のCookieを見ます)
10分経過してブラウザをリロードするとログアウトします。
Auth0のログにもそのように残っています。
結論
Auth0セッションの有効期限が切れたときにログアウトしました。
最後に
本検証を通して、予期しないログアウトはAuth0のログインセッションが影響するとわかりました。もし、予期しないログアウトが発生する場合、まずは この設定から調査をしてみてください。
ただし、クライアントアプリケーションがAuth0 SDK(SPA)で認証した場合の結果となります。結局はクライアントアプリケーションの実装次第で、ログアウトの制御ができることはご留意ください。
また、本検証は以下の考慮をしていません。
- ユーザーメタデータを変更した場合
- Silent Authenticationに対応しないブラウザ
これらのケースでも予期しないログアウトが発生する可能性があるようなのですが、また別の機会に検証してみようと思います。
以上です。