跨站登录(Cross-Site Login)通常指的是用户在一个网站(源站)登录后,可以无缝地访问另一个网站(目标站),而无需在目标站再次登录。这种功能通常依赖于某种形式的单点登录(Single Sign-On, SSO)技术来实现。
在 PHP 中实现跨站登录的需求可能包括以下几点:
- 用户体验提升:用户无需在多个网站间重复登录,提高了用户体验和便利性。
- 数据共享:通过跨站登录,用户在不同网站间的数据可以更加容易地共享,如用户信息、购物车内容等。
- 安全性:跨站登录需要确保用户数据的安全传输和存储,防止信息泄露和未授权访问。
实现跨站登录通常涉及以下步骤:
- 用户认证:在源站进行用户认证,通常是通过用户名和密码、OAuth、OpenID 或其他认证机制。
- 生成令牌:一旦用户认证成功,源站会生成一个安全的令牌(Token),这个令牌可以是一个加密的字符串,包含了用户的身份信息和有效期等。
- 令牌传输:源站将令牌通过 URL 参数、HTTP 头或其他方式传输给目标站。
- 令牌验证:目标站接收到令牌后,会向源站发送请求进行验证。源站会确认令牌的有效性,并返回相应的用户信息给目标站。
- 用户登录:如果令牌验证通过,目标站会使用从源站获取的用户信息为用户创建会话(Session),实现用户的自动登录。
在 PHP 中实现跨站登录时,需要注意以下几点:
- 安全性:确保令牌的安全性至关重要,需要使用加密和签名技术来防止令牌被篡改或伪造。
- 令牌有效期:令牌应该有一个合理的有效期,过期后需要重新进行用户认证。
- 数据传输:令牌传输过程中需要使用 HTTPS 等安全协议,防止数据在传输过程中被窃取。
- 错误处理:在令牌验证失败或传输过程中出现错误时,需要有合适的错误处理机制,确保用户体验不受影响。
总之,PHP 跨站登录的需求主要是提升用户体验和数据共享能力,实现过程中需要关注安全性和错误处理等方面。
一、用户登录
1.客户端发送请求
php
$CONF = require './conf/config.php';
require_once 'conf/common.php';
//获得登录参数,并组成数组
$loginInfo = [
'domain' => 'auth.qiaodu.net',
'user_phone' => '1350684****',
'user_pwd' => '1350684****'
];
//数组加密传递
$userInfo = AuthCode(http_build_query($loginInfo), 'ENCODE', $CONF['authCode'], '');
$url = 'http://test.com/api/api.php?act=getUserInfo&token=3cab7ce4142608c0f40c785b5ab5ca24&userInfo=' . $userInfo;
//爬取信息
$sysUser = json_decode(getAPIPort($url), true);
@$queryString = AuthCode($sysUser['data'], 'DECODE', $CONF['authCode'], '');
parse_str($queryString, $outputArray);
//输出返回信息
$res['code'] = $sysUser['code'];
$res['msg'] = $sysUser['msg'];
$res['data'] = $outputArray;
die(json_encode_lockdata($res));
2.服务端业务逻辑
php
@$userInfo = get_param('userInfo');
@$queryString = AuthCode($userInfo, 'DECODE', $CONF['authCode'], '');
parse_str($queryString, $outputArray);
$domainArr = explode('|', $CONF_SYS['sys_domain']);
//获取用户信息
$user_phone = $outputArray['user_phone'];
$user_pwd = md5($outputArray['user_pwd']);
$sql = "SELECT user_id,md5(concat(user_id,'" . $CONF['authCode'] . "')) AS user_code,user_eid,user_name,user_pwd,user_phone,user_province,user_city,user_area,depart_id,user_depart,user_auth FROM " . $db->table('user') . " WHERE 1";
$sql .= " AND user_phone ='" . $user_phone . "'";
$sql .= " ORDER BY user_id DESC";
$row = $db->query($sql);
//判断用户是否存在;
if (!$row) {
$res['code'] = 1;
$res['msg'] = $user_phone . "用户登录手机账户不存在";
$res['data'] = '';
//addlogs($user_phone, '通行证接口非法登录,STATUS:账户不存在', '', time(), getip(), 1);
die(json_encode_lockdata($res));
}
//判断密码是否正确;
if ($user_pwd != trim($row["user_pwd"])) {
$res['code'] = 1;
$res['msg'] = "登录密码不正确";
$res['data'] = '';
//操作日志;
//addlogs($user_phone, '通行证接口非法登录,STATUS:密码错误', '', time(), getip(), 1);
die(json_encode_lockdata($res));
}
if ($row["user_auth"] == 0) {
$res['code'] = 1;
$res['msg'] = "账号未审核,请联系管理员.";
$res['data'] = '';
//操作日志;
addlogs($user_phone, '通行证接口非法登录,STATUS:未审核账户', '', time(), getip(), 1);
die(json_encode_lockdata($res));
}
$sysUserInfoArr = [
'user_name' => $row['user_name'],
'user_phone' => $row['user_phone'],
'user_province' => $row['user_province'],
'user_city' => $row['user_city'],
'user_area' => $row['user_area'],
'depart_id' => $row['depart_id'],
'user_depart' => $row['user_depart']
];
@$sysUserInfo = AuthCode(http_build_query($sysUserInfoArr), 'ENCODE', $CONF['authCode'], '');
$res['code'] = 0;
$res['msg'] = "已获取到用户信息";
$res['data'] = $sysUserInfo;
die(json_encode_lockdata($res));
二、后台登录
1.客户端发送请求
php
$loginInfo = [
'user_phone' => '1350684****',
'user_pwd' => '1350684****'
];
//数组加密传递
$userInfo = AuthCode(http_build_query($loginInfo), 'ENCODE', $CONF['authCode'], '');
$url = 'http://test.com/butler.php?m=Login&a=loginDeal&act=sso&userInfo=' . $userInfo;
//跳转第三方
redirect($url);
2.服务端业务逻辑
php
//跨站登录
case "sso";
@$userInfo = get_param('userInfo');
@$queryString = AuthCode($userInfo, 'DECODE', $CONF['authCode'], '');
parse_str($queryString, $outputArray);
//获取用户信息
$user_phone = $outputArray['user_phone'];
$user_pwd = md5($outputArray['user_pwd']);
$row = $db->fetch('admin', 'user_id,user_name,user_phone,user_pwd,user_roles,user_auth,user_login_num', array('user_phone' => $user_phone), ' user_id DESC');
//判断用户是否存在;
if (!$row) {
$res['code'] = 0;
$res['msg'] = $user_phone . "未注册";
$res['data'] = '';
addlogs($user_phone, '通行证登录失败,STATUS:账户不存在', '', time(), getip());
die(json_encode_lockdata($res));
}
//判断密码是否正确;
if ($user_pwd != trim($row["user_pwd"])) {
$res['code'] = 0;
$res['msg'] = "密码不正确";
$res['data'] = '';
addlogs($user_phone, '通行证非法登录,STATUS:密码错误', '', time(), getip());
die(json_encode_lockdata($res));
}
//判断是否审核通过;
if ($row["user_auth"] != 1) {
$res['code'] = 0;
$res['msg'] = "账户权限审核中,请联系超级管理员";
$res['data'] = '';
addlogs($user_phone, '通行证非法登录,STATUS:未审核账户登录', '', time(), getip());
die(json_encode_lockdata($res));
}
//登录次数;
$session_id = session_id();
@$row['user_login_num'] = $row['user_login_num'] + 1;
@$db->update('admin', array('login_time' => time(), 'reg_ip' => getip(), 'user_login_num' => $row['user_login_num'], 'session_id' => $session_id), array('user_id' => $row["user_id"]));
addlogs($user_phone, $row["user_name"] . '-管理员PC端登录成功,STATUS:密码登录,OK', '', time(), getip());
//验证码自动销毁;
session_destroy();
//设置登录状态;
$user_id = AuthCode($row["user_id"], "ENCODE", "LOCKDATAV", "");
$user_phone = AuthCode($row["user_phone"], "ENCODE", "LOCKDATAV", "");
SetCookie("admin_id", $user_id, time() + 604800, "/", '', '', TRUE);
SetCookie("admin_phone", $user_phone, time() + 604800, "/", '', '', TRUE);
SetCookie("admin_name", $row["user_name"], time() + 604800, "/", '', '', TRUE);
SetCookie("admin_roles", $row["user_roles"], time() + 604800, "/", '', '', TRUE);
//跳转登录
$res['code'] = 1;
$res['msg'] = "您好,成功获取用户信息。";
redirect('butler.php?m=Index&a=deskTop');
break;
@漏刻有时