web-dev-qa-db-ja.com

ユーザーが1回限りのログインリンクを含む電子メールの受信をオプトアウトできるようにするにはどうすればよいですか?

したがって、私はユーザーがプライベートメッセージを受信したときに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 モジュールのクエリ文字列で、ワンタイムログインリンクがすでに使用されている場合に、ログインフォームに電子メールアドレスを事前入力します。)

やりたいこと

  1. ユーザープロファイルにブールフィールドを追加します。「電子メールに1回限りのログインリンクを送信しないでください。」
  2. 電子メール通知を送信するときに、どういうわけかそのフィールドの値を確認してください。

これを行う堅牢な方法はありますか?これが私がこれまでに考えたことです:

  • Privatemsgを使用して電子メール通知を送信する代わりに、ルールで通知を作成してみてください。しかし、これを行うと、Nice Privatemsg構成設定を使用できなくなります(たとえば、メッセージを受信するたびに、送信者ごとに1回だけなど、ユーザーがいつ電子メールを受信するかを選択できるようになります)。
  • どういうわけか、ユーザーがオプトアウトしていない場合に1回限りのリンク、またはユーザーがオプトアウトしている場合に通常のリンクを提供するトークンを作成できます。 (これを行う方法は本当にわかりません。)
  • PM E-mail Notifyサブモジュールをハッキングして、私がやりたいことを実行できます。

ユーザーがオプトアウトした場合、サイトから送信された電子メールのワンタイムログインリンクをログインへのリンクに置き換えたいフォーム

注:私のサイトは多言語対応であり、Variableおよびi18nモジュールを使用して、サイトで送信された電子メールを翻訳しています。したがって、すべてのソリューションは、多言語の電子メールを処理するために十分に堅牢である必要があります。

2
Patrick Kenny

私がすることはあなた自身のトークンを定義することです。

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;
}
2
Berdir

必要なブールフィールドをユーザープロファイルに追加し、hook_mail_alterまたはメールモジュールの同様のフックを使用して、その設定の値を確認する必要があると思います。 (値が$ userグローバルに追加されていることを確認してください)

1
rreiss

これを試してみてください。

my-login/%userなどのメニューパスを作成し、すべてのmy-login/%user/*パスをこのメニューハンドラーで処理できるようにします(カスタムモジュール、phpコードコンテンツを含むパネルなど)。

my-login/%userのように見えるように、URLの前にmy-login/[UID]/login_one_time/*を付けます

メニューハンドラーで%userを読み込み、ブール値を確認します。許可されている場合は、リクエストをlogin_one_time/*に実際のパスに送信するか、ログインブロックを表示します。

*リンクが長く見える場合は、 shorturl モジュールトークンを使用できます。

0
Vinoth.3v