Я пытаюсь включить аутентификацию в приложении Laravel с помощью Azure AD.
Я использовал код в этом репозитории , чтобы сделать это.
Одна из проблем моих проблем заключается в том, что у меня нет доступа к B2C-policys, поэтому я попытался сделать это без policys, и это моя функция getMetadata
public function getMetadata($policy_name) {
require "settings.php";
$metadata_endpoint = $metadata_endpoint_begin; // . $policy_name;
$this->metadata = $this->getEndpointData($metadata_endpoint);
}
Как видите, название политики здесь не используется. Можно ли вообще сделать это без политики?
Когда я нажимаю кнопку входа в систему, которая запускает эту функцию ...
public function login()
{
require app_path()."/Http/Controllers/settings.php";
require app_path()."/Http/Controllers/EndpointHandler.php";
// Set cookie for state
$state = rand();
setcookie("state", $state);
// Redirect to sign up/sign in page
$endpoint_handler = new EndpointHandler($generic_policy);
$authorization_endpoint = $endpoint_handler->getAuthorizationEndpoint()."&state=generic"."+". $state;
return redirect($authorization_endpoint);
}
... он направляет меня на сайт login.microsoftonline.com / ..., где я могу ввести свои учетные данные, но после этого он перенаправляет меня на страницу приветствия https://bcompetent.bertrandt.com/fleetbookingtest/public/, но не отображается моя страница приветствия, но 500 Ошибка сервера
я знаю, что вызывается функция validateSignature (показанная ниже), потому что она выводит мое эхо "
перед RSA", но не показывает мое эхо "
после RSA", поэтому я предполагаю, что она не вызывает "Crypt_RSA ();" Функция.
Строка требует app_path (). "/ Http / Controllers / phpseclib / Crypt / RSA.php"; находится в скрипте, поэтому он должен увидеть функцию. Создатель Crypt_RSA также вставляется в метод validateSignature (эхо в его начале также не отображается. Кто-нибудь может представить, почему эта функция не вызывается и почему возникает ошибка 500 Server?
Конструктор ValidateSignature и Crypt_RSA:
// Validates the RSA signature on the token
private function validateSignature() {
// Get kid from header
$kid = getClaim("kid", $this->head);
// Get public key
$key_data = $this->endpointHandler->getJwksUriData();
// Extract e and n from the public key
$e_regex = '/"kid":\W*"' . $kid . '.*"e":\W*"([^"]+)/';
$e_array = array();
preg_match($e_regex, $key_data, $e_array);
$n_regex = '/"kid":\W*"' . $kid . '.*"n":\W*"([^"]+)/';
$n_array = array();
preg_match($n_regex, $key_data, $n_array);
// 'e' and 'n' are base64 URL encoded, change to just base64 encoding
$e = $this->convert_base64url_to_base64($e_array[1]);
$n = $this->convert_base64url_to_base64($n_array[1]);
echo "<br>before RSA";
// Convert RSA(e,n) format to PEM format
$rsa = new Crypt_RSA();
echo "<br>after RSA";
var_dump($rsa);
$rsa->setPublicKey('<RSAKeyValue>
<Modulus>' . $n . '</Modulus>
<Exponent>' . $e . '</Exponent>
</RSAKeyValue>');
$public_key = $rsa->getPublicKey();
var_dump($public_key);
// Verify Signature
$to_verify_data = $this->id_token_array[0] . "." . $this->id_token_array[1];
$to_verify_sig = base64_decode($this->convert_base64url_to_base64(($this->id_token_array[2])));
$verified = openssl_verify($to_verify_data, $to_verify_sig, $public_key, OPENSSL_ALGO_SHA256);
var_dump($verified);
return $verified;
}
function __construct()
{
echo "<br><br>RSA";
if (!class_exists('Math_BigInteger')) {
include_once 'Math/BigInteger.php';
}
$this->configFile = CRYPT_RSA_OPENSSL_CONFIG;
if (!defined('CRYPT_RSA_MODE')) {
switch (true) {
// Math/BigInteger's openssl requirements are a little less stringent than Crypt/RSA's. in particular,
// Math/BigInteger doesn't require an openssl.cfg file whereas Crypt/RSA does. so if Math/BigInteger
// can't use OpenSSL it can be pretty trivially assumed, then, that Crypt/RSA can't either.
case defined('MATH_BIGINTEGER_OPENSSL_DISABLE'):
define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
break;
// openssl_pkey_get_details - which is used in the only place Crypt/RSA.php uses OpenSSL - was introduced in PHP 5.2.0
case !function_exists('openssl_pkey_get_details'):
define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
break;
case extension_loaded('openssl') && version_compare(PHP_VERSION, '4.2.0', '>=') && file_exists($this->configFile):
// some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work
ob_start();
@phpinfo();
$content = ob_get_contents();
ob_end_clean();
preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches);
$versions = array();
if (!empty($matches[1])) {
for ($i = 0; $i < count($matches[1]); $i++) {
$fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i])));
// Remove letter part in OpenSSL version
if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) {
$versions[$matches[1][$i]] = $fullVersion;
} else {
$versions[$matches[1][$i]] = $m[0];
}
}
}
// it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+
switch (true) {
case !isset($versions['Header']):
case !isset($versions['Library']):
case $versions['Header'] == $versions['Library']:
case version_compare($versions['Header'], '1.0.0') >= 0 && version_compare($versions['Library'], '1.0.0') >= 0:
define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_OPENSSL);
break;
default:
define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
define('MATH_BIGINTEGER_OPENSSL_DISABLE', true);
}
break;
default:
define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
}
}
$this->zero = new Math_BigInteger();
$this->one = new Math_BigInteger(1);
$this->hash = new Crypt_Hash('sha1');
$this->hLen = $this->hash->getLength();
$this->hashName = 'sha1';
$this->mgfHash = new Crypt_Hash('sha1');
$this->mgfHLen = $this->mgfHash->getLength();
}