「用户SSO客户端」主动登录跳转到自有业务系统用户体系

用户SSO客户端 使用文档
用户SSO客户端 使用文档

背景

用户SSO客户端提供了内置的 SSO 默认可以和其他 ModStart 系统无缝对接,可以方便的和其他系统完成账号打通。

如果需要和自己的系统完成账户打通,只需要按照如下步骤进行简单开发即可。

配置/开发步骤

第1步,关闭用户注册

功能设置 → 用户设置 → SSO客户端 → 打开禁止注册

这样避免在当前系统用户新注册后数据错乱。

第2步,配置用户SSO客户端

安装模块 https://modstart.com/m/MemberSSOClient

功能设置 → 用户设置 → SSO客户端

SSO客户端配置

  • 秘钥随机生成
  • SSO服务端地址请填写您的第三方登录处理地址

第3步,在ModStart登录时,会跳转到第三方系统登录处理地址

跳转时会携带如下参数:

  • client:当前系统的地址和SSO返回地址,如 http://cms.com/sso/client
  • timestamp: 当前时间戳,单位秒,如 1639645067
  • sign: 签名,如 efee214f978620d66ed78f200af620a8

签名计算方式:md5( md5(SSO服务端秘钥) . md5($timestamp) . md5($client) )

第4步,第三方登录系统完成登录逻辑处理后,拼接参数返回ModStart系统

第三方系统登录逻辑参考

public function ssoLoginProcess()
{
    // 在第三方系统登录成功后跳转的地址,第3步跳转时会携带该参数
    // 注意这里要检查登录来源,比如检查 ¥client=='http://xxx.com/sso/client' 避免非法链接骗取登录信息
    $client = Input::get('client');
    // SSO服务端秘钥,需要和第2步中的配置相同
    $ssoClientSecret = 'tr5wQmL73I5x0QKwqwGaxrlTH2ptrUXo';
    // SSO服务端地址,需要和第2步中的配置相同
    $server = 'http://cms.demo.soft.host/xxxx';
    // 其他处理,可以检查签名是否正确
    $sign = Input::get('sign');

    $isLogin = true;
    if (!$isLogin) {
        // 如果用户未登录,处理登录逻辑
        // 比如,展示展示登录界面,或者跳转到该系统的登录页面
        echo "模拟登录";
    } else {
        // 如果用户登录成功,跳转回ModStart系统
        $username = '登录成功的用户名';
        $timestamp = time();
        $sign = md5(md5($ssoClientSecret) . md5($timestamp . '') . md5($server) . md5($username));
        $redirectUrl = $client . '?' . http_build_query([
                'server' => $server,
                'timestamp' => $timestamp,
                'sign' => $sign,
                'username' => base64_encode($username),
            ]);
        return Response::redirect($redirectUrl);
    }
}
更新: 2023-06-24 18:56:06
QQ
微信