XH通用登录v1.3及以上版本
该版本功能说明:
例如,我现在已登录OA系统,用户名为测试,邮箱为css@qq.com,手机号码为178。如果在Dzz系统中也存在相同的用户名、电子邮件地址和手机号码,那么通过这个特殊链接打开Dzz后就是该用户的帐号。如果Dzz系统中没有这些信息,则会根据特殊链接中的帐户名和邮箱在Dzz系统中注册一个新帐户,并使用默认密码登录。管理员可以修改默认密码。
接口地址:index.php?mod=xhlogin;
请求方式:跳转方式;
请求地址:http://127.0.0.1/index.php?mod=xhlogin&dateline=XXX&email=XXX&orgpath=XXX&password=XXX&phone=XXX&username=XXX&token=XXX&redirect=XXX
接口说明:验证成功后跳转到DzzOffice首页或者指定的页面。注意:该接口可以直接通过后端登陆某个账号,注意安全保密,切勿泄露XH通用登录KAY,建议定期更换;
请求参数:
参数 | 类型 | 是否必填 | 最大长度 | 示例值 | 描述 |
dateline | int | 是 | 10 | 1712215131 | 超时时间60秒 |
username | string | 三选一 | 30 | 测试 | 用户名 |
string | 三选一 | 40 | css@qq.com | 邮箱 | |
password | string | 否 | 32 | 123456 | 用户密码 |
phone | string | 三选一 | 11 | 110 | 用户手机号码 |
orgpath | string | 否 | 小胡网/技术部,小胡网/宣传部 | 用户所属机构部门,使用逗号(,)分隔多个机构,使用斜杠(/)分隔上下级部门,如果没有找到相应的机构或部门,会自动创建 | |
redirect | string | 否 | http://127.0.0.1 | 登录成功后,跳转的地址。默认跳转到首页 | |
token | string | 是 | 6aafb1afaab15c7d44b8a1e0733eb7e7f350a48ab8441353d5d29bd3ba116543 | 签名字符串 |
组合后的地址类似于:
http://127.0.0.1/index.php?mod=xhlogin&dateline=1712215131&email=css%40qq.com&orgpath=%E5%B0%8F%E8%83%A1%E7%BD%91%2F%E6%8A%80%E6%9C%AF%E9%83%A8%2C%E5%B0%8F%E8%83%A1%E7%BD%91%2F%E5%AE%A3%E4%BC%A0%E9%83%A8&password=123456&phone=110&username=%E6%B5%8B%E8%AF%95&token=7ef48626ae74d1eec1eadc2a12a26d6ba8558643fb58a66ae36dd1e3aa2a7e7f&redirect=http%3A%2F%2F127.0.0.1
原理与流程
- 初始检查
检查XH通用登录是否开启:系统首先检查是否启用了XH通用登录功能。如果未开启,则直接返回提示信息,如“XH通用登录未开启”。
检查Token参数:验证请求中是否包含了必要的Token参数。如果Token是必要参数且未填写,则返回提示信息,如“Token参数缺失”。
- 动态时间验证(如果启用)
检查请求中的时间戳是否在允许的范围内(通常是当前时间与一个合理的时间窗口内)。如果时间戳无效,则返回提示信息,如“验证时间已过期,请重新获取”。
- 参数验证
对用户名、邮箱、密码、电话号码、机构部门等参数进行非空和格式正确性验证。
如果用户名、邮箱、电话号码参数都不存在,则返回相应的错误提示。
- Token生成与验证(如果适用)
根据传入的参数(如用户名、密码等)和服务器端的密钥,生成一个Token。
将生成的Token与请求中提供的Token进行比较。如果Token不匹配,则返回提示信息,如“Token验证失败”。
- 用户登录或注册
用户存在性查询:根据用户名、邮箱、电话号码(三选一)查询用户UID是否存在。
用户存在:更新用户信息(可选,根据传入的参数决定),并进行登录操作,随后重定向到指定页面。
用户不存在且允许注册:检查请求中是否至少包含username和email两个参数。如果满足条件,则根据传入的参数进行注册操作。注册成功后,进行登录并重定向到指定页面。
信息同步:
在用户登录或注册时,根据请求中的信息同步用户的username(用户名)、email(邮箱)、phone(手机号)、password(密码)以及机构部门等信息。如果请求中未提供某些信息,则不更新这些信息。
- 组织关系同步
机构部门信息解析:如果提供了机构部门信息,系统会根据指定的格式(使用逗号(,)分隔多个机构,使用斜杠(/)分隔上下级部门)进行解析。
机构部门关联处理:
可能先删除用户现有的机构部门关联(取决于系统设计)。
在数据库中查找解析后的机构部门。
如果机构或部门不存在,则自动创建它们。
更新用户的机构部门关联信息。
- 日志记录
在每个关键步骤(如参数验证、用户查询、登录/注册成功/失败、组织关系同步等)记录日志。确保日志信息包含足够的细节,以便在需要时能够重现用户的行为和系统的响应。这有助于后续的审计、问题追踪和系统维护。
示例(php):
$key='bljt@2023';//XH通用登录KAY
//参数
$params=array(
'dateline' => '1712215131',
'email'=>'css@qq.com',
'username'=>'测试',
'password'=>'123456',
'phone' =>'110',
'orgpath' =>'小胡网/技术部,小胡网/宣传部'
);
//参数排列
ksort($params);
/* 排序后参数数组
Array ( [dateline] => 1712215131 [email] => css@qq.com [orgpath] => 小胡网/技术部,小胡网/宣传部 [password] => 123456 [phone] => 110 [username] => 测试 )
*/
//将参数转换为url-encode字符串
$httpstr=http_build_query($params);
/* 编码后的签名字符串
dateline=1712215131&email=css%40qq.com&orgpath=%E5%B0%8F%E8%83%A1%E7%BD%91%2F%E6%8A%80%E6%9C%AF%E9%83%A8%2C%E5%B0%8F%E8%83%A1%E7%BD%91%2F%E5%AE%A3%E4%BC%A0%E9%83%A8&password=123456&phone=110&username=%E6%B5%8B%E8%AF%95
*/
//使用sha256计算签名
$token = hash_hmac('sha256',$httpstr,$key);
/*计算后的签名值
7ef48626ae74d1eec1eadc2a12a26d6ba8558643fb58a66ae36dd1e3aa2a7e7f
*/
// 重定向地址
$redirect='http://127.0.0.1';
// 组合 URL
$loginUrl = "http://127.0.0.1/index.php?mod=xhlogin&" . $httpstr . "&token=" . $token . "&redirect=" . urlencode($redirect);
/*组合后的地址
http://127.0.0.1/index.php?mod=xhlogin&dateline=1712215131&email=css%40qq.com&orgpath=%E5%B0%8F%E8%83%A1%E7%BD%91%2F%E6%8A%80%E6%9C%AF%E9%83%A8%2C%E5%B0%8F%E8%83%A1%E7%BD%91%2F%E5%AE%A3%E4%BC%A0%E9%83%A8&password=123456&phone=110&username=%E6%B5%8B%E8%AF%95&token=7ef48626ae74d1eec1eadc2a12a26d6ba8558643fb58a66ae36dd1e3aa2a7e7f&redirect=http%3A%2F%2F127.0.0.1
*/
// 执行重定向
header("Location: " . $loginUrl);
注意:
示例当中的参数即规定键名(数值或字符串)不能去掉,可以没有规定键值。比如说只有邮箱和时间戳参数值,就是如下代码:
$key='bljt@2023';//XH通用登录KAY
//参数
$params=array(
'dateline' => '1712215131',
'email'=>'css@qq.com',
'username'=>'',
'password'=>'',
'phone' =>'',
'orgpath' =>''
);
//参数排列
ksort($params);
/* 排序后参数数组
Array ( [dateline] => 1712215131 [email] => css@qq.com [orgpath] => [password] => [phone] => [username] => )
*/
//将参数转换为url-encode字符串
$httpstr=http_build_query($params);
/* 编码后的签名字符串
dateline=1712215131&email=css%40qq.com&orgpath=&password=&phone=&username=
*/
//使用sha256计算签名
$token = hash_hmac('sha256',$httpstr,$key);
/*计算后的签名值
01b43c567ef38c5d941c0d042bf27c35cd91d7b13f01019456c44d913ddfacde
*/
// 重定向地址
$redirect='http://127.0.0.1';
/*组合后的地址
http://127.0.0.1/index.php?mod=xhlogin&dateline=1712215131&email=css%40qq.com&orgpath=&password=&phone=&username=&token=01b43c567ef38c5d941c0d042bf27c35cd91d7b13f01019456c44d913ddfacde&redirect=http%3A%2F%2F127.0.0.1
*/
// 执行重定向
header("Location: " . $loginUrl);
提示信息说明:
提示信息可在系统日志-用户登录中查看详细信息。
更多建议: