したがって、私はユーザーがプライベートメッセージを受信したときに1回限りのログインリンクを介してログインできるように、サイトの更新に取り組んでいます。残念ながら、この種の機能には最近 ニュースでセキュリティの問題として報告されています が含まれているため、ユーザーがオプトアウトできるようにしたいと思います。
ワンタイムログインリンクは Login One Time モジュールによって提供されます。電子メール通知は Privatemsg モジュールのPM E-mail Notifyサブモジュールによって提供されますが、理想的には、ソリューションはルール、システムメールなど.
ログインリンクを追加する方法
PM電子メール通知UIで、「新しいメッセージを受信しました」電子メールの本文に、次のトークンを挿入します。
[privatemsg_message:recipient:login-one-time]
そしてリンク全体は:
[privatemsg_message:recipient:login-one-time]?edit[name]=[privatemsg_message:recipient:mail]
これにより、次のようなワンタイムログインリンクがユーザーに提供されます。
http:// localhost:8888/en/login_one_time/1173/1377182743/RZCfB7uwKRB_bFVCeKPNwtOnDn2jFfGMO2FdaE_cpxI?destination =?edit [name] [email protected]
(注:?edit[name][email protected]
部分は Prepopulate モジュールのクエリ文字列で、ワンタイムログインリンクがすでに使用されている場合に、ログインフォームに電子メールアドレスを事前入力します。)
やりたいこと
これを行う堅牢な方法はありますか?これが私がこれまでに考えたことです:
ユーザーがオプトアウトした場合、サイトから送信された電子メールのワンタイムログインリンクをログインへのリンクに置き換えたいフォーム
注:私のサイトは多言語対応であり、Variableおよびi18nモジュールを使用して、サイトで送信された電子メールを翻訳しています。したがって、すべてのソリューションは、多言語の電子メールを処理するために十分に堅牢である必要があります。
私がすることはあなた自身のトークンを定義することです。
login_one_time_token_info()
とlogin_one_time_tokens()
をカスタムモジュールにコピーして開始し、フック名を変更して、トークンの名前をlogin-one-time-optionalなどの名前に変更します。
次に、hook_tokens()実装の実装を変更して、$ accountのフィールドを確認し、既存の関数またはurl('user/login', array('absolute' => TRUE))
を使用するようにします。既存のユーザーのユーザーはそのフィールドにデータが保存されていない可能性があるので、デフォルト値を追加して、ヘルパー関数に次のようなものを入れたい場合があることに注意してください。
if ($items = field_get_items('user', $account, 'your_settings_field')) {
return (bool) $items[0]['value'];
}
else {
// Default to use the one time login link.
return TRUE;
}
必要なブールフィールドをユーザープロファイルに追加し、hook_mail_alterまたはメールモジュールの同様のフックを使用して、その設定の値を確認する必要があると思います。 (値が$ userグローバルに追加されていることを確認してください)
これを試してみてください。
my-login/%user
などのメニューパスを作成し、すべてのmy-login/%user/*
パスをこのメニューハンドラーで処理できるようにします(カスタムモジュール、phpコードコンテンツを含むパネルなど)。
my-login/%user
のように見えるように、URLの前にmy-login/[UID]/login_one_time/*
を付けます
メニューハンドラーで%user
を読み込み、ブール値を確認します。許可されている場合は、リクエストをlogin_one_time/*
に実際のパスに送信するか、ログインブロックを表示します。
*リンクが長く見える場合は、 shorturl モジュールトークンを使用できます。