Je rencontre des problèmes avec mon SSO, il indique qu’il n’y a pas d’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 non trouvé dans le payload');
}
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 de retour SSO non trouvée dans le payload');
}
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();
// cela doit être identique dans votre code et dans vos paramètres Discourse :
$secret = 'removed';
$sso->setSecret( $secret );
// charger le payload transmis par Discourse
$payload = $_GET['sso'];
$signature = $_GET['sig'];
// valider le payload
if (!($sso->validatePayload($payload,$signature))) {
// invalide, refuser
header("HTTP/1.1 403 Forbidden");
echo("Mauvaise requête SSO");
die();
}
$nonce = $sso->getNonce($payload);
// Insérez ici votre code d'authentification utilisateur ...
// Requis et doit être unique à votre application
$userId = $myu->id;
// Requis et doit être cohérent avec votre application
$userEmail = $myu->email;
// Optionnel - si vous ne définissez pas ces valeurs, Discourse générera des suggestions
// basées sur l'adresse e-mail
$extraParameters = array(
'username' => $myu->username,
'name' => $myu->username
);
// construire la chaîne de requête et rediriger vers le site Discourse
$query = $sso->getSignInString($nonce, $userId, $userEmail, $extraParameters);
header('Location: http://forum.bloxplays.com/session/sso_login?' . $query);
exit(0);
?>