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('ペイロードに return_sso_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);
?>