SMS Framework
Symfony NotifierのTexterおよびSMSチャンネル機能をDrupalと統合し、SMS送信と電話番号認証機能を提供します。
smsframework
概要
SMS Frameworkは、SymfonyのNotifierコンポーネントを統合することで、Drupalに包括的なSMSメッセージング機能を提供します。このモジュールは、Twilio、Vonage、Bandwidth、Brevo、Clickatell、Nexmo、Plivo、Sinchなど、60以上のSMSベンダーを通じてSMSメッセージを送信できます。
主要な機能として電話番号認証システムがあり、サイト管理者はユーザーにSMS認証コードによる電話番号の認証を要求できます。認証システムには、設定可能な有効期限、一意の電話番号の強制、期限切れ認証の自動クリーンアップ、ブルートフォース攻撃を防ぐためのフラッド保護が含まれています。
このモジュールは、認証ステータスと手順を表示する専用の電話フィールドウィジェットを提供し、ユーザーを認証プロセスに導きます。設定はUIではなくYAMLパラメータを通じて完全に行われるため、開発者はトランスポート設定、認証動作、エンティティフィールドマッピングを完全に制御できます。
Symfony Messengerが利用可能な場合、SMSメッセージはキューを介して非同期にディスパッチされ、パフォーマンスと信頼性が向上します。
Features
- Symfony Notifier DSN設定を介して60以上のSMSベンダーからSMSメッセージを送信
- 設定可能な認証コードと有効期限を持つ電話番号認証システム
- エンティティ作成・更新時の自動認証のためのエンティティから電話番号フィールドへのマッピング
- 認証ステータス、カウントダウンタイマー、手順を表示する専用電話フィールドウィジェット
- 同じ番号が複数のアカウントで認証されることを防ぐ一意の電話番号の強制
- 認証試行を制限するフラッド保護(デフォルトで6時間あたり5回)
- Cronとキューワーカーによる期限切れ認証レコードの自動クリーンアップ
- 認証メッセージをカスタマイズするためのToken対応([sms-message:verification-code]、[sms:verification-url])
- 利用可能な場合のSymfony Messengerによる非同期SMS配信
- カスタムコードが認証作成をインターセプトできるイベント駆動アーキテクチャ
- 設定可能な認証ルートパスと成功時のリダイレクトURL
- 認証フォームでのChrome Web OTPオートコンプリートのサポート
Use Cases
ユーザー電話番号認証
ユーザーアカウントに電話フィールドを追加し、エンティティマッピングを設定して自動電話認証を有効にします。ユーザーが電話番号を入力すると、認証コードを含むSMSを受信します。フィールドウィジェットは認証ステータスとカウントダウンタイマーを表示します。ユーザーは/sms/verifyにアクセスしてコードを入力し、認証を完了します。
トランザクションSMSの送信
NotifierInterfaceサービスを使用してプログラムでSMS通知を送信します。件名テキストを含むNotificationを作成し、電話番号を含むRecipientを作成して、$notifier->send($notification, $recipient)を呼び出します。メッセージは設定されたSMSトランスポートを通じてルーティングされます。
ECサイトの注文確認SMS
注文完了後、SmsPhoneNumberInterface::getPhoneNumbers()を使用して顧客のユーザーアカウントから認証済み電話番号を取得します。NotifierInterfaceを介して注文確認を送信します。認証により、メッセージが正当な受信者に届くことが保証されます。
SMSによる二要素認証
アカウントセキュリティの一部としてユーザーに電話番号の認証を要求します。一意の電話番号の強制を有効にして、同じ番号が複数のアカウントで使用されることを防ぎます。認証システムを2FA実装の構成要素として使用します。
一括SMS通知
sms_phone_number_verificationエンティティでフィルタリングしたエンティティクエリを使用して、認証済み電話番号を持つユーザーをクエリします。$notifier->send()に複数の受信者を渡して複数の受信者に通知を送信します。Symfony Messengerがインストールされている場合、メッセージは自動的にキューに入れられます。
開発とテスト
symfony/fake-sms-notifierをインストールし、DSNを'fakesms+logger://default'として設定すると、すべてのSMSメッセージを送信せずにログに記録します。SMSコストを発生させずに認証フローをテストする開発環境に便利です。
Tips
- 開発中は実際のメッセージを送信せずにDrupalログでSMSコンテンツを確認するためにfakesms+logger://default DSNを使用してください
- notifier.channel_policyを設定して、どの重要度レベルがSMSメッセージをトリガーするかを制御してください
- 認証メッセージテンプレートはSMS固有のTokenに加えてすべてのDrupal Tokenをサポートしています
- 同じ電話番号を複数のアカウントで許可する必要がある場合は、sms.verification.uniqueをfalseに設定してください
- 電話番号をログに記録したくない場合は、logger.channel.sms.phone_number_verificationをPsr\Log\NullLoggerでオーバーライドしてください
- 高トラフィックサイトでの自動非同期SMSキューイングのためにSM(Symfony Messenger)モジュールをインストールしてください
- 認証済みの番号のみを取得する場合は、電話番号を取得する際にQueryOptionsでVerificationRequirement::Verifiedを使用してください
Technical Details
Admin Pages 1
/sms/verify
ユーザーがSMSで受け取った認証コードを入力する電話番号認証フォームです。フォームは保存された認証レコードに対してコードを検証し、送信が成功すると電話番号を認証済みとしてマークします。
権限 1
Hooks 6
hook_entity_insert
マッピングされた電話番号フィールドを持つ新しいエンティティが作成されたときに電話認証の作成をトリガーします。
hook_entity_update
エンティティの電話番号が変更されたときに電話認証を更新します。追加された番号には新しい認証を作成し、削除された番号の認証を削除します。
hook_entity_delete
削除されたエンティティに関連付けられたすべての電話番号認証を削除します。
hook_cron
Cron実行中に期限切れの電話番号認証レコードをパージします。
hook_token_info
SMS FrameworkのTokenタイプを定義します: sms、sms-message、sms-recipient、sms-verification-code。
hook_tokens
認証メッセージで使用されるSMS FrameworkのTokenの値置換を提供します。
Troubleshooting 6
services.local.ymlがsettings.phpにインクルードされていることを確認してください。sms.transportsパラメータに有効なDSNがあることを確認してください。ベンダー用の正しいSymfony Notifierブリッジがインストールされていることを確認してください(例: composer require symfony/twilio-notifier)。設定変更後はCacheをクリアしてください。
services.local.ymlのsms.verification.unverified.lifetimeパラメータを増やしてください。デフォルトは900秒(15分)です。変更後はCacheをクリアすることを忘れないでください。
これは認証が保留中の場合に予期される動作です。ユーザーはフィールドのロックが解除される前に/sms/verifyで認証を完了する必要があります。認証が期限切れになった場合は、エンティティを保存して新しい認証コードをトリガーしてください。
フラッド保護により6時間あたり5回の試行に制限されています。フラッドウィンドウが過ぎるのを待つか、'sms.verify_phone_number'イベントのフラッドテーブルエントリを手動でクリアしてください。
notifier.field_mapping.smsパラメータがエンティティタイプ、バンドル、フィールド名を正しくマッピングしていることを確認してください。マッピングでverifications: trueを設定してください。フィールドが存在し、電話フィールドタイプである必要があります。
設定でsms.verification.enabledがtrueになっていることを確認してください。認証が無効になっているとルートは条件付きで削除されます。ルートを再構築するためにCacheをクリアしてください。
Security Notes 6
- フラッド保護によりブルートフォース攻撃を防ぐため認証試行を制限しています(6時間あたり5回の試行)
- 認証コードはデータベースに保存され、機密データとして扱う必要があります
- 電話番号はデフォルトでログに記録されます - ログ記録を防ぐ必要がある場合はロガーサービスをオーバーライドしてください
- 共有電話番号によるアカウント乗っ取りを防ぐため、一意の電話番号の強制を有効にしてください
- SMSトランスポートDSNにはAPI認証情報が含まれています - services.local.ymlがバージョン管理にコミットされないようにしてください
- 認証フォームは安全なコード入力のためにChrome Web OTPオートコンプリート属性を使用しています