web-dev-qa-db-ja.com

CiviCRMチェックサム/ cidがカスタムDrupalモジュールで有効であることを確認する方法

以前の質問 までフォローアップ:

簡単なカスタムDrupalモジュールを作成して、連絡先の関連組織に関する情報を表示します(興味がある場合は、上記の詳細情報を参照してください)。

1つの使用例は、ログインしたユーザーにこの情報が表示されることです。この場合、情報を表示するかどうかの決定は簡単です(Drupal連絡先IDを使用してCiviCRMから情報をプルします)。

ただし、CiviMail経由で送信されたチェックサムリンクから誰かがページにアクセスした場合、Drupalはユーザーを匿名と見なします。URLからcid(CiviCRM連絡先ID)をプルできます情報漏えいの可能性なしに情報を表示するために、チェックサムも検証できる必要があります。

私はこの関数を見つけました:CRM_Contact_BAO_Contact_Utils::generateChecksum($contactId)しかし、これはチェックサムを生成します。 (URLから)既存のチェックサムを確認するだけで、新しいチェックサムを作成する必要はありません。

3

少しぐったりして、私はこれを見つけました:

CRM_Contact_BAO_Contact_Utils::validChecksum($cid, $_GET["cs$c"])

civiCRM連絡先ID($cid)そしてそれをURLのチェックサムと比較して、次のように私のためにトリックを行いました:

  $cid = check_plain($_GET['cid']);
  if ($cid != "" && CRM_Contact_BAO_Contact_Utils::validChecksum($cid, $_GET["cs$c"])) {
        //Contact ID and Checksum match up, embed a view 
        //with $cid as an argument (or other custom functionality)
  } else {
        //Not a match, decide what you want to do in this case 
        //(e.g. check if user is logged in, or display error...)
  }

UPDATE:

(上記はまだ私のために働いていましたが)上記をそこから引き出したので、使用法はコアでわずかに変更されたようです。これを試してください( ここから取得 ):

    //check if this is a checksum authentication
$userChecksum = CRM_Utils_Request::retrieve('cs', 'String', $this);
if ($userChecksum) {
  //check for anonymous user.
  $validUser = CRM_Contact_BAO_Contact_Utils::validChecksum($tempID, $userChecksum);
  if ($validUser) {
    return $tempID;
  }
}
3