php跨站登录Cross-Site Login(用户登录、管理后台登录、单点登录Single Sign-On, SSO技术、数据共享能力、安全性和错误处理)

跨站登录(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.客户端发送请求

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;

@漏刻有时

相关推荐
雨白20 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
JaguarJack20 小时前
为什么 PHP 闭包要加 static?
后端·php·服务端
hqk20 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING21 小时前
RN容器启动优化实践
android·react native
恋猫de小郭1 天前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker1 天前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴1 天前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭2 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab2 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
ServBay2 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php