phpcms 通信失败所有解决方案,phpsso通信原理
温馨提示:
最后更新时间2020-12-28 00:49:01,若内容或图片失效,请留言反馈!
phpcms 通信失败所有解决方案,phpsso通信原理
这篇文章深入探讨下phpcms v9的phpsso单点登录通信原理。
如果遇到phpcms应用通信失败,大概有以下几个方面的问题:
1、系统配置错误,需要注意后台配置的通信密钥要和phpsso中配置的一致。
2、系统配置文件system.php和数据表v9_sso_applications没有更新成功导致的phpcms通信失败,有可能是文件权限问题。
3、服务器防火墙拦截,需要注意下将服务器本身ip加到白名单里。
4、服务器环境问题, 如果win系统,可以尝试将 127.0.0.1 localhost 加到host文件中。
5、系统对post,get 或者ua的限制。
我自己测试的phpcms因为对空UA做了限制,所以在使用file_get_contents()方法时,一直提示通信失败,所以才有了今天这篇文章。
一、通信测试加密机制
1、在配置完phpcms之后,访问应用管理,就会请求
【/phpsso_server/index.php?m=admin&c=applications&a=check_status&appid=1】
其中的appid就是我们创建的应用id,在后台能看到。
2、找到“\phpsso_server\phpcms\modules\admin”下的applications.php文件,就能看到上面请求的方法【check_status】。
获取到加密后的密钥:【$param】
【$param = sys_auth('action=check_status', 'ENCODE', $applist[$appid]['authkey']);】
其中,sys_auth是一个系统函数,在phpcms\libs\functions\global.func.php,用于加密和解密。
这个加密的方法就是,用我们前面配置的应用密钥authkey,加上关键词“action=check_status”进行加密。
然后形成一个新的字符串给$param。
3、接下来是最关键的一步了,我做测试的时候就是卡在这里,导致phpcms通信不成功。
这里有一个$url,是我们配置的通信地址,加上api接口文件,api.php?op=phpsso&,实际上$url是这么个东西:
$url = 'http://www.testtessttest.com/api.php?op=phpsso&';
然后就是带着前面加密出来的$param请求这个api.php的文件,操作方法是phpsso。
二、phpcms通信解密机制
4、【$data = @file_get_contents($url.'code='.urlencode($param))】
file_get_contents()是一个php系统函数,用于将一个文件读取到字符串中,php5.1以上支持。
也就是这段代码会请求这么一个东西:
file_get_contents(http://www.testtessttest.com/api.php?op=phpsso&code=92cfaxBifLb5MJzuQyKd5ee0D0UTIazEr6tgbMdkDEQ6ztg6AWtk4brm6SSmcI2d)
注意:如果服务器配置了禁止空UA访问,或者禁止过一些爬虫,这里可能就请求失败了,直接返回0了,也就是phpcms的通信失败。
5、上面的请求实际上是请求到/api/phpsso.php文件了。
在phpsso.php文件中:$code = $_REQUEST['code'];
就上网址上带着的code,给到$code。
6、接下来就是对$code解密了。
parse_str($client->sys_auth($code, 'DECODE'), $arr);
执行完上面代码,如果是空的就直接返回0,还是通信失败。
不空返回:$action = $arr['action'];
其实这个$arr数组中,如果$code没错,就只有一个“check_status”,也就是:
array(1) {["action"]=>string(12) "check_status"}
我就一目了然了。
if ($action == 'check_status') exit('1');
就可以返回1了。
7、上面执行的不论返回1还是0,都是在【phpsso_server\phpcms\modules\admin\templates\applications_list.tpl.php】文件中判断返回值:
communication_success:通信成功。
communication_failure:通信失败。
上面就是phpcms的phpsso通信原理了,下面说说为什么,只是我的理解,不一定完全正确。
(1)、这个phpsso,一般也叫单点登录,SSO,(SingleSignOn),也就是多站点可以使用同一套登录系统,现在很多网站都在使用这个。
比如:随便编的网址。
sso.jd.com 单点登录api接口。user.jd.com 用户中心。order.jd.com 下单地址。cart.jd.com 购物车。coll.jd.com 收藏夹。
对网络请求来说,只要是不同域,就存在跨域问题,有跨域问题,登录就是个问题,总不能用户换个地址,让重新登录吧。
一般的登录信息保存在cookies中,和session配合使用。
有了单点登录之后,用户在一个地方登录,可以是cart.jd.com,也可以是order.jd.com,只要登录成功了,就可以“共享cookies”给其他站点。
用户也就是无感知的在几个不同的域之间反复横跳,也不会让他再登录。
有了单点同步登录,就可以同步退出。
开源系统里使用的最多的是Ucenter,这款sso,和DZ一起长大的,用的系统不少。
(2)、phpcms的这个phpsso,也可以实现上面的功能,只需要添加应用就好了,添加完这后,如果是其他系统,就需要一个api接口验证,就是上面的那个流程。
(3)、对phpcms来说,这个phpsso其实还是有点鸡肋的。
后台管理登录,不需要phpsso,会员登录,在同一个域下也体现不出来,估计当时开发这套系统的同学,可能想得很久远,甚至有干掉uc,成为cms界的站群扛把子吧。
只是没成想,移动互联网来了之后,一切都变了,加上国内站长数量减少,开源cms日子不好过。
国内的像z-blog,dedecms,dz,phpwind,Empirecms都不容易,致敬这些开源同学。
文章版权声明:除非注明,否则均为林羽凡原创文章,转载或复制请以超链接形式并注明出处。