أواجه مشاكل في نظام الدخول الموحد (SSO)، حيث تظهر رسالة تفيد بعدم وجود external_id.
PHP:
<?php
$user = $_SESSION['username'];
try {
$handler = new PDO('mysql:host=localhost;dbname=removed', 'removed', 'removed');
$handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo $e->getMessage();
die();
}
$conn = mysql_connect("localhost", "removed", "removed");
mysql_select_db("removed");
if ($user) {
$myusr = $handler->query("SELECT * FROM users WHERE username='".$user."'");
$myu = $myusr->fetch(PDO::FETCH_OBJ);
if ($myu->banned == "1") {
header('Location: https://bloxplays.com/suspended');
}
$userExist = ($myusr->rowCount());
if ($userExist == "0") {
session_destroy();
header("Location: ../");
} else {
$ID = $myu->id;
}
}
echo "<title>".$ID."</title>";
namespace Cviebrock\DiscoursePHP;
use Cviebrock\DiscoursePHP\Exception\PayloadException;
class SSOHelper
{
/**
* @var
*/
private $secret;
/**
* @param $secret
* @return $this
*/
public function setSecret($secret)
{
$this->secret = $secret;
return $this;
}
/**
* @param $payload
* @param $signature
* @return mixed
*/
public function validatePayload($payload, $signature)
{
$payload = urldecode($payload);
return $this->signPayload($payload) === $signature;
}
/**
* @param $payload
* @return mixed
* @throws PayloadException
*/
public function getNonce($payload)
{
$payload = urldecode($payload);
$query = array();
parse_str(base64_decode($payload), $query);
if (!array_key_exists('nonce', $query)) {
throw new PayloadException('لم يتم العثور على nonce في الحمولة');
}
return $query['nonce'];
}
/**
* @param $payload
* @return mixed
* @throws PayloadException
*/
public function getReturnSSOURL($payload)
{
$payload = urldecode($payload);
$query = array();
parse_str(base64_decode($payload), $query);
if (!array_key_exists('return_sso_url', $query)) {
throw new PayloadException('لم يتم العثور على عنوان URL لإعادة الدخول الموحد في الحمولة');
}
return $query['return_sso_url'];
}
/**
* @param $nonce
* @param $id
* @param $email
* @param array $extraParameters
* @return string
*/
public function getSignInString($nonce, $id, $email, $extraParameters = [])
{
$parameters = array(
'nonce' => $nonce,
'external_id' => $id,
'email' => $email,
) + $extraParameters;
$payload = base64_encode(http_build_query($parameters));
$data = array(
'sso' => $payload,
'sig' => $this->signPayload($payload),
);
return http_build_query($data);
}
/**
* @param $payload
* @return string
*/
protected function signPayload($payload)
{
return hash_hmac('sha256', $payload, $this->secret);
}
}
?>
<?php
$sso = new SSOHelper();
// يجب أن يكون هذا مطابقًا للكود الخاص بك وإعدادات Discourse:
$secret = 'removed';
$sso->setSecret( $secret );
// تحميل الحمولة المرسلة من Discourse
$payload = $_GET['sso'];
$signature = $_GET['sig'];
// التحقق من صحة الحمولة
if (!($sso->validatePayload($payload,$signature))) {
// غير صالح، رفض
header("HTTP/1.1 403 Forbidden");
echo("طلب SSO غير صالح");
die();
}
$nonce = $sso->getNonce($payload);
// قم بإدراج كود مصادقة المستخدم الخاص بك هنا ...
// مطلوب ويجب أن يكون فريدًا لتطبيقك
$userId = $myu->id;
// مطلوب ويجب أن يتوافق مع تطبيقك
$userEmail = $myu->email;
// اختياري - إذا لم تقم بتعيين هذه القيم، سيقوم Discourse بتوليد اقتراحات
// بناءً على عنوان البريد الإلكتروني
$extraParameters = array(
'username' => $myu->username,
'name' => $myu->username
);
// بناء سلسلة الاستعلام وإعادة التوجيه إلى موقع Discourse
$query = $sso->getSignInString($nonce, $userId, $userEmail, $extraParameters);
header('Location: http://forum.bloxplays.com/session/sso_login?' . $query);
exit(0);
?>