跨站登录(Cross-Site Login)通常指的是用户在一个网站(源站)登录后,可以无缝地访问另一个网站(目标站),而无需在目标站再次登录。这种功能通常依赖于某种形式的单点登录(Single Sign-On, SSO)技术来实现。

在 PHP 中实现跨站登录的需求可能包括以下几点:

  1. 用户体验提升:用户无需在多个网站间重复登录,提高了用户体验和便利性。
  2. 数据共享:通过跨站登录,用户在不同网站间的数据可以更加容易地共享,如用户信息、购物车内容等。
  3. 安全性:跨站登录需要确保用户数据的安全传输和存储,防止信息泄露和未授权访问。

实现跨站登录通常涉及以下步骤:

  1. 用户认证:在源站进行用户认证,通常是通过用户名和密码、OAuth、OpenID 或其他认证机制。
  2. 生成令牌:一旦用户认证成功,源站会生成一个安全的令牌(Token),这个令牌可以是一个加密的字符串,包含了用户的身份信息和有效期等。
  3. 令牌传输:源站将令牌通过 URL 参数、HTTP 头或其他方式传输给目标站。
  4. 令牌验证:目标站接收到令牌后,会向源站发送请求进行验证。源站会确认令牌的有效性,并返回相应的用户信息给目标站。
  5. 用户登录:如果令牌验证通过,目标站会使用从源站获取的用户信息为用户创建会话(Session),实现用户的自动登录。

在 PHP 中实现跨站登录时,需要注意以下几点:

  • 安全性:确保令牌的安全性至关重要,需要使用加密和签名技术来防止令牌被篡改或伪造。
  • 令牌有效期:令牌应该有一个合理的有效期,过期后需要重新进行用户认证。
  • 数据传输:令牌传输过程中需要使用 HTTPS 等安全协议,防止数据在传输过程中被窃取。
  • 错误处理:在令牌验证失败或传输过程中出现错误时,需要有合适的错误处理机制,确保用户体验不受影响。

总之,PHP 跨站登录的需求主要是提升用户体验和数据共享能力,实现过程中需要关注安全性和错误处理等方面。

一、用户登录

1.客户端发送请求

$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.服务端业务逻辑


@$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.客户端发送请求

$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.服务端业务逻辑

 //跨站登录
    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;

@漏刻有时

04-03 23:20