如何保存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
相关产品推荐
相关产品推荐

