You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保存SSO接口返回的Token并处理登录校验流程?

问题分析与修复方案

核心问题排查

你的代码存在几个关键问题导致流程异常:

  • 重定向传递Token的方式错误:redirect('/dashboard', ['_token' => $token]) 的第二个参数是HTTP状态码,并非查询参数,当前写法会把数组当作状态码处理,导致Token无法正确传递到仪表盘。
  • 响应处理不够严谨:仅判断状态码200和_token存在,未处理SSO请求失败(如超时、连接错误)的场景,会误判为凭证无效。
  • Token传递方式不安全:直接通过URL参数传递Token易泄露,不符合安全规范。

修复后的代码

$UserName = $request->input('UserName');
$Password = $request->input('Password');

try {
    // 向SSO系统发送请求验证凭证
    $response = Http::post('http://sso.gov.in:0000/SSOREST/SSOAuthJSON', [
        'UserName' => $UserName,
        'Password' => $Password,
    ]);

    // 检查请求是否成功且返回有效JSON
    if ($response->successful() && $response->json()) {
        $responseData = $response->json();
        if (isset($responseData['_token'])) {
            $token = $responseData['_token'];
            
            // 将Token存入Session,后续请求从Session获取(更安全)
            session(['sso_token' => $token]);
            
            // 重定向至仪表盘(若用路由名称更规范)
            return redirect()->route('dashboard');
            // 若必须通过URL传递,使用withQueryParams:
            // return redirect('/dashboard')->withQueryParams(['_token' => $token]);
        }
    }

    // 认证失败(无Token或响应无效)
    return back()->with('fail', 'Invalid username or password.');
} catch (\Exception $e) {
    // 处理SSO服务不可用的情况
    return back()->with('fail', 'SSO service is temporarily unavailable. Please try again later.');
}

额外优化建议

  • 仪表盘验证Token:在仪表盘的控制器中,从Session取出session('sso_token'),调用SSO的Token验证接口确认有效性,避免非法访问。
  • 使用路由名称:优先用redirect()->route('dashboard')代替硬编码URL,便于后续路由调整。
  • 错误信息区分:针对不同失败场景返回不同提示,帮助用户排查问题。

内容的提问来源于stack exchange,提问作者Vikram Vishvakarma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:17:20