web-dev-qa-db-ja.com

カスタムユーザー登録メール内でdrupal_get_token()を使用する方法

Drupal 7.のカスタムユーザー登録モジュールを作成中です。現在、送信ハンドラ内に関数ser_saveを呼び出す独自のカスタムフォームがあります。新しいユーザーアカウントを作成します。このアカウントは最初は「無効」として作成され、ユーザーがカスタムウェルカムメールのリンクを使用してアカウントを確認した場合にのみアクティブになります。

URLクエリ文字列に追加するトークンを生成しました(dookal_get_token()を使用してhook_mail()によって生成された電子メールに含まれています):

$myToken = drupal_get_token('email_verify_'.$params->uid);

残念ながら、カスタムメール内の登録リンクにアクセスすると、常にアクセス拒否メッセージが表示されます。私は、hook_mailおよびページコールバック内にUIDを格納する両方の値をチェックしましたが、それらは実際に正しいです。

ここで見逃しているものはありますか?代わりにser_pass_reset_url()を使用することを検討しましたが、登録時にユーザーパスワードを取得するため、ユーザーがパスワードを2回再入力する必要はありません。

前もって感謝します!

編集#2:Pontusのコードを追加する

hook_menuの実装:

//callback to verify user via email link
$items['custom_user/signup/verify/%'] = array(
  'title' => 'Activate your Account',
  'page callback' => 'customer_user_signup_verify_email_page',
  'page arguments' => array(3),
  'file' => 'includes/custom_user_signup.verify.inc',
  'access arguments' => array('access content'),
  'type' => MENU_CALLBACK,
);

customer_user_signup_verify_email_page()コールバック関数drupal_valid_token():内の有効なトークンかどうかを確認します

if (empty($_GET['tok']) || !drupal_valid_token($_GET['tok'], 'email_verify_' . $user_id)) {
    drupal_access_denied();
}else{
    //enable account now that we know you're a valid user
}

メールに印刷されたURL:

http://mysite.com/custom_user/signup/verify/10?tok=Zh2MmBHLnjvd3Dq9KcDxkwJ0lmk_QmMg5QNZomC7Okw
1
Alex Kirsten

これが失敗する理由は、 drupal_get_token() および drupal_valid_token()session_id() の値を使用するためです=トークンを生成して検証します。

問題は、session_id()がページの読み込みごとに匿名ユーザーに対して異なる値を返すことです。したがって、drupal_valid_token()によって生成されるトークンは、入力(drupal_get_token())が異なるため、sessoin_id()で生成されるトークンとは異なります。

匿名ユーザーの次のページロードでトークンを比較するフォーム送信の場合、フォームページで drupal_session_start() を呼び出すと、セッションが開始され、結果がsession_id()は、フォームページと結果ページで同じです。しかし、ユーザーがメールからサイトに戻るリンクをクリックしている場合、session_id()の値は、次のページが正確に読み込まれる場合にのみ同じになります。私のテストは、Drupalがdrupal_session_start()によって作成されたセッションを次のページの読み込み時に破棄することを示しています。

4
Adam Balsam