$skew = time() - strtotime($assertion['NotBefore']);
if ($skew < -120) {
  error_log('sso clock skew: ' . $skew . 's');
  return false;
}

从主站点头像进客服后台,绕一圈又回到登录页,SSO 服务端日志里写着 assertion not yet valid,两台机器的时间差了 90 秒。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,断言里带了生效时间,客服服务器没开对时服务,比标准时间慢了一分半,校验方直接判无效。这种失败不会报具体时间差,只给一个笼统的无效。

这次卡住的地方就在「客服 SSO 时钟偏移」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:两台机器都开时间同步,先把这个偏差压到一秒以内;校验时允许两分钟的时钟漂移,别卡死在零;日志里把断言时间和当前时间一起打出来,下次一眼能看出差多少。

改完只确认一件事:校时之后回调一次就进后台,日志里的偏差在 1 秒以内。

作者 9823189