您的位置:首页 > 运维架构 > 网站架构

wecenter二次开发系列(三)——多个wc框架同域网站共享cookie

2015-11-03 18:25 603 查看
由于项目需要,我们需要多个二级域名问答网站对整站的内容进行独立管理和运营。

那么,如何实现用户在任何一个子站或主站登入登出统一步调呢?在这里我们首先需要共享cookie,从而实现同域单点登录,统一生成.xxx.com下的cookie,使得主站和子站用生成的cookie进行用户身份校验。

主要涉及三个文件:

system/core/user.php 读取cookie并进行解码

app/account/ajax.php 登录后设置cookie

models/account.php 设置cookie

具体的代码修改分以下几块:

1.对于主站

改动:设置主站system/class/cls_http.inc.php中setcookie函数$domain为”.xxx.com”。

public static function set_cookie($name, $value = '', $expire = null, $path = '/', $domain = null, $secure = false, $httponly = false)
{
if (! $domain and G_COOKIE_DOMAIN)
{
$domain = G_COOKIE_DOMAIN;
}
$domain = '.xxx.com';

return setcookie('jdn_' . $name, $value, $expire, $path, $domain, $secure, $httponly);
//return setcookie(G_COOKIE_PREFIX . $name, $value, $expire, $path, $domain, $secure, $httponly);
}


说明:由于不明的原因G_COOKIE_DOMAIN define无效,故设置cookie的时候直接指定域为.xxx.com

2.对于子站:

改动1:system/class/cls_http.inc.php

说明:二级域名获取cookie必须保证名称一致,另外二级域名在生成cookie的时候同样要指定域为.xxx.com。

代码中注释部分为代码。

/*** 获取 COOKIE
*
* @param $name*/
public static function get_cookie($name)
{
// if (isset($_COOKIE[G_COOKIE_PREFIX . $name]))
// {
// return $_COOKIE[G_COOKIE_PREFIX . $name];
// }

if (isset($_COOKIE['jdn_' . $name]))
{
return $_COOKIE['jdn_' . $name];
}

return false;
}

/**
* 设置 COOKIE
*
* @param $name
* @param $value
* @param $expire
* @param $path
* @param $domain
* @param $secure
* @param $httponly
*/
public static function set_cookie($name, $value = '', $expire = null, $path = '/', $domain = null, $secure = false, $httponly = false)
{
if (! $domain and G_COOKIE_DOMAIN)
{
$domain = G_COOKIE_DOMAIN;
}
$domain = '.f1bang.com';

return setcookie('jdn_' . $name, $value, $expire, $path, $domain, $secure, $httponly);
//return setcookie(G_COOKIE_PREFIX . $name, $value, $expire, $path, $domain, $secure, $httponly);
}


改动2:/system/functions.inc.php 将用户登录信息编译成 hash 字符串,用于发送 Cookie

这里的G_COOKIE_HASH_KEY同样需要指定为一级域名的hashkey=’fwtvfmbkzamtjyq’(具体需要调试查看主站的hashkey确定,可能会有变动)

/**
* 将用户登录信息编译成 hash 字符串,用于发送 Cookie
*
* @param  string
* @param  string
* @param  string
* @param  integer
* @param  boolean
* @return string
*/
function get_login_cookie_hash($user_name, $password, $salt, $uid, $hash_password = true)
{
if ($hash_password)
{
$password = compile_password($password, $salt);
}

//$auth_hash_key = md5(G_COOKIE_HASH_KEY . $_SERVER['HTTP_USER_AGENT']);
$auth_hash_key = md5('fwtvfmbkzamtjyq' . $_SERVER['HTTP_USER_AGENT']);

return H::encode_hash(array(
'uid' => $uid,
'user_name' => $user_name,
'password' => $password
), $auth_hash_key);
}


改动3:system/core/user.php 读取cookie并进行解码

说明:G_COOKIE_HASH_KEY如果主站的不一致,必须指定一直,这里为’fwtvfmbkzamtjyq’,另外还需指定cookie名jdn__user_login。

public function __construct()
{
if (AWS_APP::session()->client_info AND ! $_COOKIE['jdn__user_login'])
{
unset(AWS_APP::session()->client_info);
}

if (! AWS_APP::session()->client_info AND $_COOKIE['jdn__user_login'])
{
//$auth_hash_key = md5(G_COOKIE_HASH_KEY . $_SERVER['HTTP_USER_AGENT']);
$auth_hash_key = md5('fwtvfmbkzamtjyq' . $_SERVER['HTTP_USER_AGENT']);
// 解码 Cookie
$sso_user_login = H::decode_hash($_COOKIE['jdn__user_login'], $auth_hash_key);

if ($sso_user_login['user_name'] AND $sso_user_login['password'] AND $sso_user_login['uid'])
{
if (AWS_APP::model('account')->check_hash_login($sso_user_login['user_name'], $sso_user_login['password']))
{
AWS_APP::session()->client_info['__CLIENT_UID'] = $sso_user_login['uid'];
AWS_APP::session()->client_info['__CLIENT_USER_NAME'] = $sso_user_login['user_name'];
AWS_APP::session()->client_info['__CLIENT_PASSWORD'] = $sso_user_login['password'];

return true;
}
}

return false;
}
}


特别注意:这里的‘jdn_’,’fwtvfmbkzamtjyq’可能会发生改变,具体可查看浏览器中cookie确定

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: