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

“没有‘访问-控制-允许-起源’标题.”。我添加了以下标题,但仍然不起作用:
header('Access-Control-Allow-Origin: https://localhost');在我的后端,我以以下方式包括CAS:
require_once Yii::app()->basePath.'/lib/CAS.php';这产生了一个错误,我从(~第81行)中解析了更改CAS文件夹中的"Autoload.php“:
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
}此代码产生上述错误。因此,我还测试了"example_gateway.php“,这是随CAS文件夹而来的,它工作起来很有魅力。我还复制了它生成的url,当我将它粘贴到浏览器中时,它将把我带到CAS。它也会将我返回到正确的页面。这基本上是代码,但是没有包含的带有php文件的HTML。我在这里做错什么了?你会改变头的周围来阻止这个呼叫吗?在这个问题上任何帮助都会很有帮助的。
更新:经过进一步测试,这仍然是断断续续的。如果我用:
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 .| 如果我打开我的网络日志,我看到的就是:

这不是在重定向我。
发布于 2016-02-02 20:32:58
因此,经过一周左右的研究,我找到了一种适合我的方法。我相信一定有一个更好的方法来做这件事,但这是可行的。
因此,在这里安装了最新版本的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=...希望这个冗长的解释能帮助那些和我一样努力的人。
https://stackoverflow.com/questions/35162802
复制相似问题