退出提示 「Access denied for agent changed」
排查思路:
这是与 uc 请求的时候出问题导致。具体报错部分是 uc_server/mode/user.php 中的 function init_input 函数部分的 ,对 $agent 进行了判断。
- if(($getagent
&& $getagent != $this->input['agent']) || (!$getagent
&& md5($_SERVER['HTTP_USER_AGENT']) != $agent)) { - exit('Access denied for agent changed');
- }
下
面我们来简单分析下退出的时候是怎么 uc 请求的,打开 class_member.php 找到 on_logout 函数部分
$ucsynlogout = $this->setting['allowsynlogin'] ? uc_user_synlogout() :
''; 这这么一行代码,这是判断程序是否开启了同步登录。如果开启了同步登录 uc_user_synlogout() 会执行请求
接下来,分析下 uc_user_synlogout( 这些函数的调用是来自 loaducenter()) 。打开 uc_client/client.php
- function uc_user_synlogout() {
- if(@include UC_ROOT.'./data/cache/apps.php') {
- if(count($_CACHE['apps']) > 1) {
- $return = uc_api_post('user', 'synlogout', array());
- } else {
- $return = '';
- }
- }
- return $return;
- }
使用 post 方式请求 uc 。 大家可以阅读下 uc_api_post 是怎么处理的 。 uc_api_post 中有 uc_api_requestdata 这么个函数
再看下 uc_api_input 函数。这个函数就是对输入内容进行处理 使用 uc_authcode 进行加密处理,其中的 UC_key
是咱们熟悉的 config_ucenter.php 中的 UC_KEY 。 到此,大家应该对请求部分大体上有个了解,下面我们来看
uc_server 端的接收
我们看到 uc_api_requestdata 函数中的部分
- $post = "m=$module&a=$action&inajax=2&release=".UC_CLIENT_RELEASE."&input=$input&appid=".UC_APPID.$extra;
然后使用 uc_fopen2(此函数原理,大家自行阅读在此不做介绍) 去请求。
打开 uc_server/index.php 文件
- if(in_array($m,
array('app', 'frame', 'user', 'pm', 'pm_client', 'tag', 'feed',
'friend', 'domain', 'credit', 'mail', 'version'))) { - if(file_exists(UC_ROOT.RELEASE_ROOT."control/$m.php")) {
- include UC_ROOT.RELEASE_ROOT."control/$m.php";
- } else {
- include UC_ROOT."control/$m.php";
- }
- $classname = $m.'control';
- $control = new $classname();
- $method = 'on'.$a;
- if(method_exists($control, $method) && $a{0} != '_') {
- $data = $control->$method();
- echo is_array($data) ? $control->serialize($data, 1) : $data;
- exit;
- } elseif(method_exists($control, '_call')) {
- $data = $control->_call('on'.$a, '');
- echo is_array($data) ? $control->serialize($data, 1) : $data;
- exit;
- } else {
- exit('Action not found!');
- }
- }
会
对用请求的内容进行处理,然后找到对应的模块就行响应请求。 退出的时候,程序会进入到 uc_server/model/base.php 文件中的
init_input() 函数 $input = $this->authcode($input, 'DECODE',
$this->app['authkey']); 如果这里的解压有问题。那么,就会导致出现 『Access denied for agent
changed』 这样的错误。
解决方法:
现在我们来分析下原因:
在这个请求的过程中,牵涉的到加密和解密两个部分,如果两个其中有一方的 key 不一样都会导致出现问题,用户要仔细检查
config_ucenter.php 中 UC_KEY 和 UC_APPID 是否与
uc_server/data/cache/apps.php 中的 authkey 和 appid(这里 key 和 appid
有时候会出现与 ucenter 中心的不一样问题,一般是文件权限导致) 是否对应。 其次,有时候
域名有 uc_api 中的 uc 访问路径有问题的时候,请配置下 config_ucenter.php 中的 UC_IP