使用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
相关产品推荐
相关产品推荐

