Jumbojett\OpenIDConnectClient长且脆弱的state GET参数优化咨询
问题
我正在开发基于PHP的OIDC启用站点,选用Jumbojett\OpenIDConnectClient后整体表现良好,但从OIDC返回网站时会生成过长的state和session_state GET参数。这些参数虽为必需,却存在以下问题:
- 浏览器后退导航会导致功能异常
- URL变得杂乱不堪
- 认证过程会覆盖原有GET参数
我仅在代码开头调用$oidc->authenticate()方法,未做其他复杂配置,想知道是否可以像其他实现方案一样,将这些state值存储到session或Cookie中?
补充:我尝试过如下配置,虽然能避免生成GET参数,但仍会清除页面传入的原有GET参数,且每次页面加载都会触发认证流程,开销很大,求解决办法:
self::$oidc->addScope(array('openid')); self::$oidc->setAllowImplicitFlow(true); self::$oidc->addAuthParam(array('response_mode' => 'form_post'));
解决方案
1. 启用Session存储State(推荐)
Jumbojett\OpenIDConnectClient本身支持将state存储到Session中,只需在调用authenticate()前开启Session并配置相关参数:
// 先开启Session session_start(); // 初始化OIDC客户端 $oidc = new Jumbojett\OpenIDConnectClient(...); // 配置使用Session存储state $oidc->setUseSession(true); // 可选:自定义Session中存储state的键名,默认是'openid_connect_state' // $oidc->setSessionKey('my_custom_oidc_state'); // 再调用认证方法 $oidc->authenticate();
这样state会被存在Session里,回调时不会在URL里携带冗长的state参数,同时也能避免覆盖原有GET参数。
2. 保留原有GET参数
如果需要保留页面原本的GET参数,可以在发起认证前先把这些参数存在Session里,认证完成后再取出恢复:
session_start(); // 保存原有GET参数(排除OIDC回调相关参数) if (!isset($_GET['code']) && !isset($_GET['error'])) { $_SESSION['original_get_params'] = $_GET; } $oidc = new Jumbojett\OpenIDConnectClient(...); $oidc->setUseSession(true); if ($oidc->authenticate()) { // 认证成功后恢复原有GET参数 if (isset($_SESSION['original_get_params'])) { $_GET = array_merge($_GET, $_SESSION['original_get_params']); unset($_SESSION['original_get_params']); } // 后续业务逻辑 }
3. 优化form_post模式的重复认证问题
你之前用的response_mode=form_post模式之所以每次加载都触发认证,是因为没有正确判断用户是否已认证。可以通过检查用户是否持有有效身份凭证来避免重复发起认证:
session_start(); $oidc = new Jumbojett\OpenIDConnectClient(...); $oidc->addScope(array('openid')); $oidc->setAllowImplicitFlow(true); $oidc->addAuthParam(array('response_mode' => 'form_post')); // 检查是否已有有效身份信息 if (!$oidc->getVerifiedClaims()) { // 未认证才发起认证 $oidc->authenticate(); } else { // 已认证,处理业务逻辑并恢复原有GET参数 if (isset($_SESSION['original_get_params'])) { $_GET = array_merge($_GET, $_SESSION['original_get_params']); unset($_SESSION['original_get_params']); } }
内容的提问来源于stack exchange,提问作者Snappawapa
相关产品推荐
相关产品推荐

