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

使用openid-client获取token遇checks.state参数缺失错误

解决 openid-client 中 checks.state argument is missing 错误

问题诊断

你遇到的问题核心在于调用client.callback时,没有传入用于验证的原始state值——尽管回调参数里的state存在,但openid-client需要你提供发起授权请求时生成的原始state来完成校验,否则会触发该错误。

另外你的代码里还有一个潜在问题:toString(userState) === toString(state) 写法有误,全局toString()函数的调用方式不规范,且state作为字符串直接用===比较即可。

修复代码

修改后的代码示例如下:

const params = client.callbackParams(req);
// 假设原始state存储在会话中,比如req.session.state(根据你的实际存储方式调整)
const originalState = req.session.state; 

console.log(params);
// 正确比较回调返回的state与原始state
if (params.state === originalState) {
    try {
        // 调用callback时传入第三个参数,指定用于校验的原始state
        const tokenSet = await client.callback(
            'http://localhost:3000/callback', 
            params,
            { state: originalState } // 关键:传入原始state完成校验
        );
        console.log(tokenSet);
    } catch (err) {
        console.error(err);
    }
};

关键说明

  • openid-client的callback方法第三个参数是校验选项,其中state字段必须是你发起授权请求时(比如调用client.authorizationUrl())生成并存储的原始值,用于和回调返回的state做一致性校验,防范CSRF攻击。
  • 确保原始state在授权请求发起时已正确存储(比如存在session、cookie中),回调时取出用于校验。
  • 无需额外转换字符串类型,params.state本身就是字符串,直接用===比较即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:21:06