Аутентификация Laravel с помощью Azure AD - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь включить аутентификацию в приложении 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();
}
...