Persistent Login

ユーザーログインフォームに「ログイン状態を保持する」機能を提供し、ブラウザセッションを跨いでログイン状態を維持できるようにします。

persistent_login
6,032 sites
53
drupal.org

インストール

Drupal 11 v2.2.4
composer require 'drupal/persistent_login:^2.2'
Drupal 10, 9 v8.x-1.10
composer require 'drupal/persistent_login:8.x-1.10'

概要

Persistent Login モジュールは、Drupal サイトにセキュアな「ログイン状態を保持する」機能を実装します。ユーザーがログイン時に「ログイン状態を保持する」オプションにチェックを入れると、ブラウザを閉じた後でもサイトに戻った際に自動的にログインされます。

PHP セッションの有効期限を単純に延長する方法(これはセキュリティ上問題があり、すべてのユーザーに適用されてしまいます)とは異なり、このモジュールはセキュアなトークンベースのアプローチを使用します。シリーズ/インスタンスパターンを使用してハッシュ化されたトークンをデータベースに保存し、シリーズ値は長期間保持され、インスタンス値は使用のたびに更新されます。このアプローチは、永続的な認証を維持しながらトークンの盗難を検出するのに役立ちます。

このモジュールは標準の Drupal セッションと連携して動作するよう設計されています。ブラウザを閉じると PHP セッションは終了しますが、永続ログイン Cookie は保持されます。次回アクセス時に、ユーザーは永続トークンを使用して自動的に認証されます。

Features

  • ユーザーログインフォームに設定可能なラベル付きの「ログイン状態を保持する」チェックボックスを追加
  • シリーズ/インスタンスパターンを使用したセキュアなトークンベース認証(Barry Jaspan の「Improved Persistent Login Cookie Best Practice」で説明されているアプローチに類似)
  • 日数で設定可能なトークン有効期間、使用するたびに有効期間を延長するオプション付き
  • ユーザーごとの永続ログイントークンの最大数を設定可能
  • Cron による期限切れトークンの自動クリーンアップ
  • ユーザーはプロフィールページでアクティブな永続ログインを確認可能
  • パスワード変更時のトークン自動無効化、すべてのデバイスからログアウトするオプション付き
  • ユーザーがログアウト、削除、またはキャンセルされた場合にトークンを自動クリア
  • 保留中の永続ログイン Cookie を持つユーザーにキャッシュされたページを配信しないページキャッシュリクエストポリシー
  • セキュリティ強化のための HTTPS 専用 Cookie プレフィックスをサポート
  • 多言語サイト向けの設定翻訳サポート

Use Cases

コミュニティサイトや会員ポータルサイト

ユーザーが定期的にコンテンツにアクセスするコミュニティサイトや会員ポータルでは、永続ログインを有効にすることでセキュリティを維持しながら繰り返しのログイン要求を排除し、ユーザーエクスペリエンスを向上させます。ユーザーは個人のデバイスで「ログイン状態を保持する」にチェックを入れることで、ブラウザの再起動後もログイン状態を維持できます。

ユーザーアカウント付きの EC サイト

顧客アカウントを持つオンラインストアは、永続ログインを使用して顧客のログイン状態を維持し、リピート購入をより便利にすることができます。設定可能なトークン制限により、ユーザーが同時にログインするデバイス数を制御できます。

企業イントラネット

従業員が毎日アクセスする社内サイトでは、永続ログインにより手間を軽減しつつ、トークンの自動有効期限によりセッションが無期限に持続しないようにします。ユーザーごとのトークン一覧により、管理者とユーザーはアクティブなセッションを監視できます。

マルチデバイスアクセス管理

ユーザーが複数のデバイスからアクセスするサイトでは、最大トークン制限を使用して同時に許可される永続ログイン数を制御できます。ユーザーはアクティブなセッションを確認でき、管理者は適切な制限を設定できます。

利便性を備えたセキュリティ重視のサイト

セキュリティとユーザーの利便性のバランスが必要なサイトでは、使用時の有効期間延長オプション付きで短いトークン有効期間(例:7日)を設定できます。これにより、非アクティブなセッションは速やかに期限切れになり、アクティブなユーザーはログイン状態を維持できます。

Tips

  • モジュールを有効にする前に services.yml でセッション Cookie の有効期間を 0 に設定し、ステータスレポートの警告を回避してください
  • 頻繁にアクセスされるサイトでは「使用時に有効期間を延長」を有効にして、アクティブなユーザーのログイン状態を維持することを検討してください
  • ユーザーが無制限の永続セッションを持つことを防ぐため、適切な最大トークン制限を設定してください
  • 同じドメインで複数の Drupal サイトを運用している場合は、一意の Cookie プレフィックスを使用してください
  • Cookie プレフィックスを変更すると、永続セッションを持つすべてのユーザーがログアウトされることを覚えておいてください
  • 永続ログイントークンは、データベース内にハッシュ化された値として安全に保存されます
  • ユーザーはプロフィールページの「永続ログイン」タブでアクティブな永続ログインを確認できます

Technical Details

Admin Pages 2
Persistent Login /admin/config/system/persistent_login

トークン有効期間、ユーザーあたりの最大トークン数、ログインフォームのラベル、Cookie プレフィックスなど、永続ログイン機能の設定を行います。

永続ログイン /user/{user}/persistent-logins

ユーザーのアクティブな永続ログインセッションのテーブルを表示し、各セッションがいつ作成され、最後に使用され、いつ期限切れになるか(有効期間が設定されている場合)を示します。このページはユーザープロフィールページのタブとしてアクセスできます。

Hooks 6
hook_form_user_login_form_alter

ユーザーログインフォームに「ログイン状態を保持する」チェックボックスを追加し、チェックされた場合に永続ログイントークンを作成するサブミットハンドラーをアタッチします。

hook_form_user_form_alter

パスワード変更時にユーザー編集フォームに「他のすべてのデバイスからログアウト」チェックボックスを追加します。新しいパスワードと一緒にチェックされると、そのユーザーのすべての永続ログイントークンがクリアされます。

hook_user_logout

ユーザーがログアウトした時に現在のセッションの永続ログイントークンをクリアします。

hook_user_cancel

ユーザーのアカウントがキャンセルされた時に、そのユーザーのすべての永続ログイントークンをクリアします。

hook_user_delete

ユーザーのアカウントが削除された時に、そのユーザーのすべての永続ログイントークンをクリアします。

hook_cron

Cron 実行時にデータベースから期限切れの永続ログイントークンをクリーンアップします。

Troubleshooting 5
ブラウザ再起動後にユーザーのログイン状態が維持されない

services.yml ファイルに 'session.storage.options.cookie_lifetime: 0' が設定されていることを確認してください。このモジュールでは、永続ログイン Cookie が認証を引き継ぐために、セッション Cookie がブラウザを閉じた時に期限切れになる必要があります。

ステータスレポートにセッション Cookie の有効期間に関するエラーが表示される

サイトの services.yml ファイルを編集して session.storage.options パラメータを追加または変更し、cookie_lifetime を 0 に設定してから、キャッシュを再構築してください。

Varnish やその他のリバースプロキシの背後で永続ログインが機能しない

永続ログイン Cookie(デフォルトプレフィックスは 'PL'、HTTPS の場合は 'SPL')を含むリクエストに対してキャッシュされたレスポンスを配信しないようにリバースプロキシを設定してください。

設定変更後にすべてのユーザーがログアウトされた

Cookie プレフィックスを変更すると、既存のすべての永続ログイン Cookie が無効になります。これは期待される動作です。ユーザーは再度ログインして「ログイン状態を保持する」を選択する必要があります。

ユーザートークンがクリーンアップされない

サイトで Cron が定期的に実行されていることを確認してください。モジュールの hook_cron 実装がデータベースから期限切れトークンを削除します。

Security Notes 6
  • このモジュールは、トークン盗難を検出できるセキュアなシリーズ/インスタンストークンパターンを使用します。同じシリーズで異なるインスタンスのトークンが2回使用された場合、潜在的な盗難を示します
  • トークンはデータベース内にハッシュ化された値として保存されるため、データベースが侵害されても生のトークン値を復元することはできません
  • ユーザーが「他のすべてのデバイスからログアウト」オプションをチェックしてパスワードを変更すると、モジュールはすべてのトークンを自動的にクリアします
  • ユーザーがログアウト、削除、またはアカウントがキャンセルされた場合、トークンは自動的に無効化されます
  • HTTPS サイトでは、Cookie 衝突攻撃を防ぐために異なる Cookie プレフィックス(先頭に 'S' が付加)が使用されます
  • ページキャッシュポリシーにより、永続ログイン Cookie を持つユーザーにキャッシュされた匿名ページが配信されることを防ぎ、適切な認証を保証します