首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法用phpCas和Yii重定向到CAS登录

无法用phpCas和Yii重定向到CAS登录
EN

Stack Overflow用户
提问于 2016-02-02 20:04:49
回答 1查看 2K关注 0票数 0

我把头撞在这上面已经有一段时间了,似乎无法做到这一点。当我调用"phpCas::forceAuthentication“时,我一直收到以下错误。

“没有‘访问-控制-允许-起源’标题.”。我添加了以下标题,但仍然不起作用:

代码语言:javascript
复制
header('Access-Control-Allow-Origin: https://localhost');

在我的后端,我以以下方式包括CAS:

代码语言:javascript
复制
require_once Yii::app()->basePath.'/lib/CAS.php';

这产生了一个错误,我从(~第81行)中解析了更改CAS文件夹中的"Autoload.php“:

代码语言:javascript
复制
spl_autoload_register('CAS_autoload');

代码语言:javascript
复制
spl_autoload_register('CAS_autoload',true ,true);

它解决了这个问题。因此,有了所有这些背景,这里就是我试图登录到CAS的代码:

代码语言:javascript
复制
 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
}

此代码产生上述错误。因此,我还测试了"example_gateway.php“,这是随CAS文件夹而来的,它工作起来很有魅力。我还复制了它生成的url,当我将它粘贴到浏览器中时,它将把我带到CAS。它也会将我返回到正确的页面。这基本上是代码,但是没有包含的带有php文件的HTML。我在这里做错什么了?你会改变头的周围来阻止这个呼叫吗?在这个问题上任何帮助都会很有帮助的。

更新:经过进一步测试,这仍然是断断续续的。如果我用:

代码语言:javascript
复制
window.location.href = "/path/to/my/login/function";

它会改变方向的罚款。另外,如果我设置了自己的xhr请求,它有时会这样做。但是,当我调用注销函数时,我从不重定向.永远不会。这是怎么回事?以下是调试日志。

代码语言:javascript
复制
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 .|   

如果我打开我的网络日志,我看到的就是:

这不是在重定向我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-02 20:32:58

因此,经过一周左右的研究,我找到了一种适合我的方法。我相信一定有一个更好的方法来做这件事,但这是可行的。

因此,在这里安装了最新版本的phpCAS之后:https://developer.jasig.org/cas-clients/php/current/

我将"CAS“文件夹和"CAS.php”文件移到我的后端代码中。

然后,我用下面的代码生成了一个类似于文件的中间人:

代码语言:javascript
复制
<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”所调用):

代码语言:javascript
复制
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“函数:

代码语言:javascript
复制
window.location.href=...

希望这个冗长的解释能帮助那些和我一样努力的人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35162802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档