同じドメインで Django プロジェクトと vBulletin ボードのシングル サインオン (SSO) を作成する最も簡単な方法は何ですか?
vBulletin ユーザーの既存のデータベースがあります。Django のRemoteUserBackendと vBulletin のvBSSOを調べましたが、完全な解決策は見つかりませんでした。
同じドメインで Django プロジェクトと vBulletin ボードのシングル サインオン (SSO) を作成する最も簡単な方法は何ですか?
vBulletin ユーザーの既存のデータベースがあります。Django のRemoteUserBackendと vBulletin のvBSSOを調べましたが、完全な解決策は見つかりませんでした。
私は Django を知りませんが、このような場合は「bridges」で検索してください。誰かがすでにあなたのためにそれを行っている可能性が高い.
これらの 3 つの情報源は、独自の橋渡しを行う際にも役立ちます。
Drupal ブリッジ
http://drupalcode.org/project/drupalvb.git/blob/9b5ab7b93043edfc2fe09c083cc9108344e26577:/drupalvb.inc.php
CakePHP ブリッジ
https://github.com/ceeram/static_bakery/blob/master/src/articles/2010/01/Vbulletin-Bridge-For-CakePHP.rst
汎用ブリッジ
http://www.saurdo.com/11/11/utilizing-the-vbulletin-database-in-your-main-site
基本的に、Cookie を調べて vBulletin DB のセッション ハッシュと照合し、ユーザーがログインしていることを確認する必要があります。その後、すべてのユーザー情報を収集できます。
Generig Bridge を実行している 3 番目のリンクを引用します。
/* Check if session exist then return user id*/
function get_session($hash){
dbconnect();
$hash = mysql_real_escape_string($hash);
$ip = implode('.', array_slice(explode('.', $_SERVER['REMOTE_ADDR']), 0, 4 - 1));
$newidhash = md5($_SERVER['HTTP_USER_AGENT'] . $ip);
$query = "SELECT * FROM session WHERE sessionhash = '".$hash."' LIMIT 1";
$result = mysql_query($query);
if(mysql_num_rows($result) > 0){
$row = mysql_fetch_array($result);
$sessionhash = $row['sessionhash'];
$idhash = $row['idhash'];
$userid = $row['userid'];
$lastactive = $row['lastactivity'];
return ($idhash == $newidhash && (time() - $lastactive) < 900) ? $userid : false;
}
return false;
}
データベースの Cookie 値を確認します。
function get_cookie($id, $pass){
dbconnect();
$id = mysql_real_escape_string($id);
$query = "SELECT * FROM user WHERE userid = ".$id." LIMIT 1";
$result = mysql_query($query);
if(mysql_num_rows($result) > 0){
$row = mysql_fetch_array($result);
$dbpass = $row['password'];
// vb might change the salt from time to time. can be found in the /includes/functions.php file
if(md5($dbpass . '0d582e0835ec6697262764ae6cb467fb') == $pass){
return $id;
}
}
return false;
}
すべてをまとめて、ユーザーがログに記録されているかどうかを判断します。
function check_login(){
if(isset($_COOKIE['bb_userid']) && isset($_COOKIE['bb_password'])){
if(get_cookie($_COOKIE['bb_userid'], $_COOKIE['bb_password'])){
return $_COOKIE['bb_userid'];
}
}
if(isset($_COOKIE['bb_sessionhash'])){
if(get_session($_COOKIE['bb_sessionhash'])){
return get_session($_COOKIE['bb_sessionhash']);
}
}
return false;
}
表示するユーザー情報を取得します。
function user_info($id){
dbconnect();
$result = mysql_query("SELECT * FROM user WHERE userid = ".mysql_real_escape_string($id)." LIMIT 1";);
return mysql_fetch_array($result);
}
結論として、上記の関数をどこかで使用してください。このような:
if($li = check_login()){
dbconnect();
$uinfo = user_info($li);
$q_lastactivity = "UPDATE user SET lastactivity = '".time()."' WHERE userid = ".$li." LIMIT 1";
mysql_query($q_lastactivity);
if((time() - $uinfo['lastactivity']) > 900){
$q_lastvisit = "UPDATE user SET lastvisit = '".$uinfo['lastactivity']."' WHERE userid = ".$li." LIMIT 1";
mysql_query($q_lastvisit); }
}
少しでも前進するための参考になれば幸いです。