0

私はしばらくこれに頭を悩ませてきましたが、これを機能させることができないようです。「phpCas::forceAuthentication」を呼び出すと、次のエラーが発生し続けます。 ここに画像の説明を入力

「「Access-Control-Allow-Origin」ヘッダーがありません...」。次のヘッダーを追加しましたが、まだ機能しません。

header('Access-Control-Allow-Origin: https://localhost');

私のバックエンドでは、次の方法で CAS を含めます。

require_once Yii::app()->basePath.'/lib/CAS.php';

これによりエラーが発生し、CASフォルダーの「Autoload.php」を(〜81行目)から変更して解決しました:

spl_autoload_register('CAS_autoload');

spl_autoload_register('CAS_autoload',true ,true);

そしてそれはその問題を解決しました。したがって、すべての背景を踏まえて、CAS にログインするために使用しようとしているコードを次に示します。

 require_once Yii::app()->basePath.'/lib/CAS.php';
 ...
 ...
 public function actionLogin() {
    phpCAS::setNoCasServerValidation();                     //don't verify SSL (testing)
    $url = Yii::app()->params['casReturnURL'];
    phpCAS::setFixedServiceURL ($url);                      //redirect from cas to this url
    phpCAS::forceAuthentication();                          //authenticate user
    $this->actionIsLoggedInFetch();                         //check login status

}
 function actionIsLoggedInFetch(){
    phpCAS::setNoCasServerValidation();                     //don't validate SSL (testing)
    $url = Yii::app()->params['casReturnURL'];              //return url from CAS
    phpCAS::setFixedServiceURL ($url);                      //set return url
    $auth = phpCAS::checkAuthentication();                  // check CAS authentication

    if ($auth == true) {                        
        $_SESSION['LOGGEDIN'] = true;
        $_SESSION['USER'] = phpCas::getUser();              //get currently authenticate user
        $return['LOGGEDIN'] = true;
    } 
    else {
        $_SESSION['LOGGEDIN'] = false;
        $return['LOGGEDIN'] = false;
        $_SESSION['USER'] = 'invalid';
    }
    echo jsonEncodePlusYii($return);
}
 public function actionLogout() {
    valRequestMethodGet();
    phpCAS::setNoCasServerValidation();                     //don't verify SSL
    $url = Yii::app()->params['casReturnURL'];
    phpCAS::logoutWithRedirectService($url);                //logout then redirect to url
}

このコードは、上記のエラーを生成します。そのため、CAS フォルダーに付属していて魅力的に機能する「example_gateway.php」もテストしました。また、それが生成する URL をコピーしたので、ブラウザーに貼り付けると、CAS に問題なくアクセスできます。また、正しいページにも戻ります。これは基本的にそのコードですが、php ファイルに HTML が含まれていません。ここで何が間違っていますか?Yii はこの呼び出しを防ぐためにヘッダーを変更しますか? これに関するヘルプは本当に役に立ちます。

更新:さらにテストした後、これはまだ断続的です。私が使用する場合:

window.location.href = "/path/to/my/login/function";

それはうまくリダイレ​​クトされます。また、独自の xhr リクエストを設定すると、時々それが行われます。ただし、ログアウト機能を呼び出すと、リダイレクトされることはありません....これまでに。何が起こっている?ここにデバッグログがあります。

2C49 .START (2016-02-04 16:23:17) phpCAS-1.3.4 ****************[CAS.php:467]
2C49 .=> phpCAS::client('2.0', 'cas.byu.edu', 443, '/cas') [CasController.php:9]
2C49 .|    => CAS_Client::__construct('2.0', false, 'cas.byu.edu', 443, '/cas', true) [CAS.php:359]
2C49 .|    <= ''
2C49 .<= ''
2C49 .=> phpCAS::setNoCasServerValidation() [CasController.php:33]
2C49 .|    You have configured no validation of the legitimacy of the cas    server. This is not recommended for production use. [CAS.php:1617]
2C49 .<= ''
2C49 .=> phpCAS::setFixedServiceURL('https://localhost/welfareManager') [CasController.php:35]
2C49 .<= ''
2C49 .=> phpCAS::forceAuthentication() [CasController.php:36]
2C49 .|    => CAS_Client::forceAuthentication() [CAS.php:1078]
2C49 .|    |    => CAS_Client::isAuthenticated() [Client.php:1249]
2C49 .|    |    |    => CAS_Client::_wasPreviouslyAuthenticated() [Client.php:1362]
2C49 .|    |    |    |    no user found [Client.php:1604]
2C49 .|    |    |    <= false
2C49 .|    |    |    no ticket found [Client.php:1463]
2C49 .|    |    <= false
2C49 .|    |    => CAS_Client::redirectToCas(false) [Client.php:1258]
2C49 .|    |    |    => CAS_Client::getServerLoginURL(false, false) [Client.php:1625]
2C49 .|    |    |    |    => CAS_Client::getURL() [Client.php:342]
2C49 .|    |    |    |    <= 'https://localhost/welfareManager'
2C49 .|    |    |    <= 'https://cas.byu.edu/cas/login?service=https%3A%2F%2Flocalhost%2FwelfareManager'
2C49 .|    |    |    Redirect to : https://cas.byu.edu/cas/login?service=https%3A%2F%2Flocalhost%2FwelfareManager [Client.php:1632]
2C49 .|    |    |    exit()
2C49 .|    |    |    -
2C49 .|    |    -
2C49 .|   

ネットワーク ログを開くと、次のように表示されます。

ここに画像の説明を入力

それは私をリダイレクトしていません:( .

4

1 に答える 1

1

それで、これに1週間ほど取り組んだ後、私は自分に合った方法を手に入れました. これを行うにはもっと良い方法が必要だと確信していますが、これでうまくいきます。

ここから phpCAS の最新バージョンをインストールした後: https://developer.jasig.org/cas-clients/php/current/

「CAS」フォルダーと「CAS.php」ファイルをバックエンド コードに移動しました。

次に、次のコードを使用して仲介者のようなファイルを生成しました。

<html>
<body>
    CAS Services completed. Redirecting, please wait...
</body>
<script>
//-------------------- PHPCAS SECTION ----------------------------  
<?php
require_once 'protected/lib/CAS.php';
phpCAS::client(CAS_VERSION_2_0, 'cas.byu.edu', 443, '/cas');
//--------------------------------------------------------------------------
phpCAS::setNoCasServerValidation();
$url = 'https://localhost/welfareManagerBackend/CASLogic.php';    //You will notice that I am redirecting back to myself. This is how we get this to work, so this was on purpose
phpCAS::setFixedServiceURL($url);

if (isset($_REQUEST['logout'])) {
    echo "Logging Out.";
    $_SESSION['AUTH'] = false;
    $_SESSION['AUTH_USER'] = ''; 
    //phpCAS::logout();
    $url = "https://localhost/welfareManager/";
    phpCAS::logoutWithRedirectServiceAndUrl($url,'');
}
else {
    $auth = phpCAS::checkAuthentication();
    if($auth == false) {
        $_SESSION['AUTH'] = false;
        $_SESSION['AUTH_USER'] = '';
        phpCAS::forceAuthentication();
    }
    else {
        $_SESSION['AUTH'] = true;
        $_SESSION['AUTH_USER'] = phpCAS::getUser();
    }
} 
?>
//--------------- PAGE REDIRECTING SERVICES -----------------------------------
    console.log('CAS Finished. Redirecting...');
    var url = window.location.origin+window.location.pathname;
    url = url.replace(window.location.pathname,'/welfareManager/');
    window.location.href = url;
</script>

これが JS、HTML、および PHP の混合物であることがわかります。なぜ私はこれを行うのですか!? 私も好きではありませんが、これはうまくいきます。CAS を呼び出す関数に ajax 呼び出しを行うたびに、元の質問で話していた上記のエラーがすべて吐き出されるため、このようにします。これを回避するには、CAS を呼び出して CAS の戻り値を取得する php ページがある場合、これらのひどいエラーが発生することなく毎回動作します。次に、サーバー上の他のスクリプト呼び出しの前に認証されていることを確認するために使用する独自の php セッション変数を設定します。このページでは、CAS がどのように返されても、常にフロント エンドのインデックスにリダイレクトされます。CAS から返された内容に基づいてセッション変数を設定するために使用されます。

次に、新しいページに移動するように上記のコードを呼び出します(上記のコード「CASLogic.php」で呼び出しました):

attemptLogin:function(){
    var url = window.location.origin+window.location.pathname+"../welfareManagerBackend/CASLogic.php";
    console.log("Traveling To URL: "+url);
    window.location.href = url;
},
userLogout:function(){
    console.log("Logging Out");
    var url = window.location.origin+window.location.pathname;
    url = url.replace(window.location.pathname,'/welfareManagerBackend/CASLogic.php?logout');
    window.location.href = url;
},

(フロントエンドでポリマーを使用しています)。ここで最も重要な部分は、次のようにして「CASLogic.php」関数を呼び出すことです。

window.location.href=...

この長い説明が、将来、私と同じように苦労している誰かの助けになることを願っています.

于 2016-02-02T20:32:58.250 に答える